4
public static IList<T> LoadObjectListAll<T>()
{
    ISession session = CheckForExistingSession();
    var cfg = new NHibernate.Cfg.Configuration().Configure();
    var returnList = session.CreateCriteria(typeof(T));
    var list = returnList.List();
    var castList = list.Cast<typeof(T)>();
    return castList;
}

そのため、「リスト」要素を汎用 IList にキャストしているときにビルド エラーが発生します。ここで明らかなエラーが発生することはありますか?

4

11 に答える 11

7

Tタイプでも でもないSystem.Type. T型パラメータです。 typeof(T)の型を返しますTtypeof演算子はオブジェクトに作用せず、型のオブジェクトを返しますTypehttp://msdn.microsoft.com/en-us/library/58918ffs.aspx

@ジョンはあなたの直接の質問に答えて正しいです。しかし、そこにある NHibernate コードは少しずれています。たとえば、 を取得したISessionFactory に を構成するべきではありません。ISession

public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}
于 2008-09-04T03:26:21.377 に答える
5

おもう

var castList = list.Cast<typeof(T)>();

する必要があります

var castList = list.Cast<T>();

@Jon Limjap私が見ることができる最も明白なエラーは、 anが an とは明らかにIList異なるということIList<T>です。AnIListは一般的ではありません (例: ArrayList)。

元の質問はすでにIList<T>. 誰かがフォーマットを編集したときに削除されました。おそらくMarkdownの問題です。

今修正しました。

于 2008-09-04T03:14:58.783 に答える
1

IList は IList<T> であり、彼女が投稿したときにマークダウンによって混乱しました。フォーマットしようとしましたが、 <T> をエスケープできませんでした..今それを修正しています。

于 2008-09-04T03:23:18.107 に答える
1

CLI は、デリゲートを使用する場合、共変性と反変性の一般的な引数のみをサポートしますが、一般的なものを使用する場合、いくつかの制限があります。たとえば、文字列をオブジェクトにキャストできるため、ほとんどの人は List to a List でも同じことができると想定しますが、ジェネリック パラメーター間に共分散がないため、これを行うことはできませんが、この記事でわかるように、共分散をシミュレートすることはできます。したがって、抽象ファクトリによって生成されるランタイムの型に依存します。

それはマルコフ連鎖のように読めます... ブラボー。

于 2008-09-04T03:32:07.260 に答える
1

「元の質問はすでに を使用していましたIList<T>。誰かがフォーマットを編集したときに削除されました。おそらく Markdown の問題です。」

それが私が見たものですが、誰かによって編集されたので、共分散について説明しましたが、何らかの理由で-1にマークされました。

于 2008-09-04T03:40:42.980 に答える
1

T はすでに型パラメーターなので、typeof を呼び出す必要はありません。TypeOf は型を取り、その型パラメーターを返します。

于 2008-09-04T03:16:56.873 に答える
1

@ジョナサン・ホランド

T はすでに型パラメーターなので、typeof を呼び出す必要はありません。TypeOf は型を取り、その型パラメーターを返します。

typeofタイプを「取り」、そのタイプを返しますSystem.Type

于 2008-09-04T03:49:27.280 に答える
1

混乱を招く一時変数が多すぎます

それ以外の

var returnList = session.CreateCriteria(typeof(T));
var list = returnList.List();
var castList = list.Cast<typeof(T)>();
return castList;

やるだけ

return session.CreateCriteria(typeof(T)).List().Cast<T>();
于 2008-09-04T04:56:41.800 に答える
0

デリゲートを使用する場合、CLI は共変性と反変性List<string>の一般的な引数のみをサポートしますが、一般的なものを使用する場合、いくつかの制限List<object>があります。ジェネリック パラメーター間には共分散がないため、これを行う必要はありませんが、この記事でわかるように、共分散をシミュレートできます。したがって、抽象ファクトリによって生成されるランタイムの型に依存します。

于 2008-09-04T03:31:19.553 に答える
0

@Jon と @Jonathan は正しいですが、戻り値の型を次のように変更する必要もあります

IList<T>

また。それが単なるマークダウンのバグでない限り。

@ジョナサン、そうだと思いました。

使用している nHibernate のバージョンがわかりません。2.0 のゴールド リリースはまだ試していませんが、いくつかの行を削除することで、メソッドをクリーンアップできます。

public static IList<T> LoadObjectListAll()
{
    ISession session = CheckForExistingSession();
    // Not sure if you can configure a session after retrieving it.  CheckForExistingSession should have this logic.
    // var cfg = new NHibernate.Cfg.Configuration().Configure();
    var criteria = session.CreateCriteria(typeof(T));
    return criteria.List<T>();
}
于 2008-09-04T03:18:33.547 に答える
-1

私が見ることができる最も明白なエラーは、 anIListが an とは明らかに異なるということIList<T>です。AnIListは一般的ではありません (例: ArrayList)。

したがって、メソッドの署名は次のようになります。

public static IList<T> LoadObjectListAll()
于 2008-09-04T03:18:38.057 に答える