如何动态获取类的非泛型类型和属性?

时间:2012-07-11 12:04:04

标签: c# reflection

如何动态获取从Person类(Student,Teacher)继承的所有非泛型类以及Person类的属性(Address)。

示例代码:

 [DataContract]
 [KnownType(typeof(Student))]
 [KnownType(typeof(Teacher))]
 public abstract class Person {
     [DataMember]
     public string Name { get; set; }

     [DataMember]
     public string Surname { get; set; }

     [DataMember]
     public Address _Address { get; set; }
 }

2 个答案:

答案 0 :(得分:1)

var nonGenericProperties = typeof(Person)
    .GetProperties()
    .Where(p => !p.IsGenericType)
    .ToList();

var nonGenericClassesWhichInheritFromPerson = Assembly.GetAssembly(typeof(Person))
    .GetTypes()
    .Where(t => t.IsSubclassOf(typeof(Person))
    .ToList()

第二个查询仅检查同一程序集中的派生类型。

答案 1 :(得分:0)

要查找继承Person的所有类,您需要定义您要查找的位置。你无处可寻。假设所有类都与Person类在同一个程序集中,您可以编写:

Assembly.GetAssembly(typeof(Person)).GetTypes().Where(t => typeof(Person).IsAssignableFrom(t) && !t.ContainsGenericParameters);

对于属性,在所有属性的foreach循环中执行相同的操作:

foreach (var pi in typeof(Person).GetProperties())
{
// Do the same for pi.PropertyType
}