如何获取类的IEnumerable属性或从该类继承的类的IEnumerable属性



在c#中,我有一个带有属性的类,它返回IEnumerables。

public class MyClass
{
public IEnumerable<MyPropClass1> Prop1 { get { return _prop1; } }
public IEnumerable<MyPropClass2> Prop2 { get { return _prop2; } }
public IEnumerable<AnotherClassAltogether> Prop3 {get {return _prop3; } }
...
}

假设MyPropClass1和MyPropClass2都继承自MyPropBaseClass,但AnotherClassAltogether没有。

从MyClass中获得所有属性的最简单方法是什么?这些属性要么是某个类的IEnumerable,要么是继承自该类的某个类的IEnumerable ?

。如果我想在MyClass中查询基于IEnumerables模板化到基于MyPropBaseClass的属性那么它应该返回Prop1和Prop2

为了更清晰(希望能解决票数接近的问题),回答这个问题的伪函数类似于:

var properties = GetIEnumerablePropertiesOfType(typeof(MyClass), typeof(MyPropBaseClass))

,这将返回包含Prop1和Prop2的属性列表(作为System.Reflection.PropertyInfo的可枚举对象)

using System;
using System.Reflection;    
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public class Program
{
public class MyPropClass{}
public class MyPropClass1 : MyPropClass{}
public class MyPropClass2 : MyPropClass{}
public class AnotherClassAltogether {}
public class MyClass
{
public object Prop_Wrong { get; set; }
public IEnumerable Prop_Wrong_IEnumerable { get; set; }
public IEnumerable<MyPropClass1> Prop1 { get; set; }
public IEnumerable<MyPropClass2> Prop2 { get; set; } 
public IEnumerable<AnotherClassAltogether> Prop3 {get; set; }
}
public static IEnumerable<PropertyInfo> GetIEnumerablePropertiesOfType(Type targetType, Type lookFor)
{
return targetType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.PropertyType.IsGenericType
&& x.PropertyType.GetGenericTypeDefinition() == typeof(IEnumerable<>)
&& x.PropertyType.GenericTypeArguments.Single().IsAssignableTo(lookFor));
}
public static void Main()
{
foreach (var item in GetIEnumerablePropertiesOfType(typeof(MyClass), typeof(MyPropClass)))
{
Console.WriteLine($"Property {item.Name} of type {item.PropertyType}");
}
}
}

相关内容

  • 没有找到相关文章

最新更新