2017-08-11 10 views
0

を継承するプロパティを見つける:C#の反射が、私は次のシナリオで反射機構を使用する方法を思ったんだけど型が他のいくつかのタイプ

public class A { } 
public class B { } 

public class ListA : ICollection<A> { } 

public class ListB : ICollection<B> { } 

public class Container 
{ 
    public ListA LA { get; set; } 
    public ListB LB { get; set; } 
} 

その後、私はタイプICollection<B>

を継承するタイプ、プロパティを見つけたいです
var container = new Container(); 

var found = container.GetType().GetProperties().FirstOrDefault(x => x.PropertyType == typeof(ICollection<B>)); 

もちろん、found変数はnullなので、反射を深くするにはどうすればよいですか?

答えて

5

List<B>はもちろんICollection<B>と同じタイプではありません。あなたの==は失敗します。

var found = typeof(Container).GetProperties() 
       .FirstOrDefault(x => typeof(ITest<B>).IsAssignableFrom(x.PropertyType)); 

代わりにあなたがPropertyType実装インタフェース確認することができます:あなたがしたい場合は、ここで

var found = typeof(Container).GetProperties() 
       .FirstOrDefault(x => x.PropertyType.GetInterfaces().Contains(typeof(ICollection<B>))); 
+0

最初のメソッドがクラスでも機能するはずであることを正しく理解していますか? –

+1

@SamvelPetrosovはい。 –

1

をあなたは、プロパティのタイプがICollection<B>に割り当てることができるかどうかを確認する必要があり

あなたのケースでは、それはICollection<B>のいくつかのインターフェイスを実装するクラスを取得する、あなたは反射のGetInterfaces()メソッドを使用して、次のコードを使用することができます:

var container = new Container(); 

var found = container.GetType().GetProperties().FirstOrDefault(x => x.PropertyType.GetInterfaces().Contains(typeof(ICollection<B>))); 
関連する問題