2016-04-08 5 views
-1

私は私の式はnull返しSystem.Collections.Generic.IEnumerable'1[MyClass]タイプSystem.Collections.Generic.IEnumerable'1は[MyClassの]私のラムダ式で

に問題を持っているが、それはいけない:

  • myCustomList.Where(x => x.bType != null && x.bType is IEnumerable<T>).FirstOrDefault();

私AddWatchは私を示しています

  • Tについて:System.Collections.Generic.List<MyClass>
  • x.bTypeについて:Type
  • x.bType is IEnumerable<T>戻りfalseとして {System.Collections.Generic.IEnumerable'1[MyClass]}dynamic {System.RuntimeType}
  • x.bType != nullは、trueを返します。

x.bTypeはプロパティであり、値は通常typeof(IEnumerable<MyClass>))です。

を更新し

私は...x.bType == typeof(IEnumerable<T>)..に自分の表現を変えました。

x.bTypeは赤色で表示されます{System.Collections.Generic.IEnumerable'1[MyClass]}List<MyClass>IEnumerable<MyClass>に変換できないようです。 、私が見るのでx.bType.DeclaringMethodためSystem.InvalidOperationExceptionx.bType.GenericParameterAttributesx.bType.GenericParameterPosition

(私はx.bTypeを開くと)私は間違って何をしたのですか?

SOLUTION:x.bType.IsAssignableFrom(typeof(T))、しかしrelfectionは、私の場合にはそのパフォーマンスではありませんので、多分解決策は、反射せずにそこにある:すべて、特に@Wilkoのファンデヴェーンに

おかげで、これは私の問題を解決しましたか? !

+1

少なくともショー。 bTypeの設定方法 –

+0

注: 'System.Collections.Generic.IEnumerable'1 [MyClass]'は文字列で、 'IEnumerable '型で呼び出された 'ToString()'メソッドの結果です(デバッガはそれを呼び出して変数に関する情報を表示します)。実際のものは 'System.Collections.Generic.IEnumerable ' – ASh

+0

@Henk Holterman 'bType = typeof(IEnumerable )'です。助けてくれてありがとう – kkkk00999

答えて

2

のIEnumerableをisteadのジェネリックTに確認するために、特定のクラスは、リフレクション経由で特定のインターフェイスを実装するかどうかをチェックすることができます:

list.Where(L => l.GetType()IsAssignableFrom(typeof演算(IEnumerableを<>))

型はジェネリックIEnumerableをクラスから割り当て可能である場合は、このチェック

+0

ありがとう、これはそれを解決した 'x.bType.IsAssignableFrom(typeof(T))' – kkkk00999

0

タイプをisでチェックすることはできません。あなたは(...)BTYPE == typeof演算に行かなければならない

x.bType == typeof(IEnumerable<T>) 

EDIT:ちょうど実現 ああ、あなたのTは(System.Collections.Generic.List)typeof演算であるので、これは「できること仕事。それItn't 可能、 Xに BTYPE = typeof演算(IEnumerableを) とです。TypeCheckの発現パートに BTYPE = typeof演算(一覧) から、あなたのBTYPEを設定する部分を変更します。BTYPE == typeof演算(T)

完全な表現は、次のようになります。

myCustomList.Where(x => x.bType != null && x.bType == typeof(T)).FirstOrDefault() 

EDIT2:申し訳ありませんくそー、私は(たぶん私は削除されますより多くのコーヒーを必要とするので、イタリックの部分を忘れてしまいました私は後で)。私は

あなたのジェネリックT.考えていたと私は本当に意味: イマイチそれ可能、リスト

+0

ありがとうございますが、それでもfalseを返す... – kkkk00999

+0

[mcve]を作成します。 –