質問

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;
}

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

役に立ちましたか?

解決

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

@Johnはあなたの直接の質問に正しく答えています。しかし、そこにある NHibernate コードは少し間違っています。を設定すべきではありません ISessionFactory を得る ISession, 、 例えば。

public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}

他のヒント

私は思う

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

あるべきです

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

@jon limjap私が見ることができる最も明白なエラーは IList とは明らかに違う IList<T>. 。アン IList 非世です(例、 ArrayList).

元の質問はすでに IList<T>. 。誰かが書式設定を編集したときに削除されました。おそらくMarkdownに問題があると思われます。

現在修正済みです。

IList は IList<T> ですが、彼女が投稿したときにマークダウンによって混乱しただけです。フォーマットしようとしましたが、<T> をエスケープし忘れました。修正中です。

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

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

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

「元の質問ではすでに IList<T>. 。誰かが書式設定を編集したときに削除されました。おそらくマークダウンの問題です。」

それが私が見たものですが、誰かによって編集されており、それが共分散についての説明を載せた理由ですが、何らかの理由で -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>();

@ジョナサン・ホランド

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

typeof 型を「受け取って」、その型を返します System.Type

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

@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>();
}

私が見た中で最も明らかな間違いは、 IList とは明らかに違う IList<T>. 。アン IList 非汎用的である (例: ArrayList).

したがって、メソッドのシグネチャは次のようになります。

public static IList<T> LoadObjectListAll()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top