C#反射查找类型继承其他类型的属性
我想知道如何在以下场景中使用反射机制:C#反射查找类型继承其他类型的属性,c#,reflection,C#,Reflection,我想知道如何在以下场景中使用反射机制: 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; } } 公
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; }
}
公共类A{}
公共类B{}
公共类列表A:ICollection{}
公共类列表B:ICollection{}
公营货柜
{
公共列表a{get;set;}
public ListB LB{get;set;}
}
然后我想找到一个属性,哪个类型继承类型ICollection
var container=newcontainer();
var found=container.GetType().GetProperties().FirstOrDefault(x=>x.PropertyType==typeof(ICollection));
当然,found
变量是空的,因此如何通过反射更深入地移动?List
当然与ICollection
的类型不同。这就是为什么您的==
失败的原因
您需要检查属性类型是否可以分配给i集合
:
列表
当然与i集合
的类型不同。这就是为什么您的==
失败的原因
您需要检查属性类型是否可以分配给i集合
:
如果您想要获取实现某个接口的类,那么在您的情况下,它是
ICollection
,您可以使用以下使用反射的GetInterfaces()
方法的代码:
var container = new Container();
var found = container.GetType().GetProperties().FirstOrDefault(x => x.PropertyType.GetInterfaces().Contains(typeof(ICollection<B>)));
var container=newcontainer();
var found=container.GetType().GetProperties().FirstOrDefault(x=>x.PropertyType.GetInterfaces().Contains(typeof(ICollection));
如果您想要得到实现某个接口的类,在您的例子中是ICollection
,您可以使用下面的代码使用反射的GetInterfaces()
方法:
var container = new Container();
var found = container.GetType().GetProperties().FirstOrDefault(x => x.PropertyType.GetInterfaces().Contains(typeof(ICollection<B>)));
var container=newcontainer();
var found=container.GetType().GetProperties().FirstOrDefault(x=>x.PropertyType.GetInterfaces().Contains(typeof(ICollection));
我是否正确理解第一个方法也应该与类一起工作?@SamvelPetrosov是。我是否正确理解第一个方法也应该与类一起工作?@SamvelPetrosov是。
var found = typeof(Container).GetProperties()
.FirstOrDefault(x => x.PropertyType.GetInterfaces().Contains(typeof(ICollection<B>)));
var container = new Container();
var found = container.GetType().GetProperties().FirstOrDefault(x => x.PropertyType.GetInterfaces().Contains(typeof(ICollection<B>)));