Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#反射查找类型继承其他类型的属性_C#_Reflection - Fatal编程技术网

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