我需要从嵌套属性中获取值

时间:2011-05-09 06:43:27

标签: c# reflection

我需要从嵌套属性中获取值。

在MainClass中,我有一个学生属性,即学生类的类型。

MainClass obj = new MainClass ();

obj.Name = "XII";
obj.Students = new List<Students>()
    {
        new Students() { ID = "a0", Name = "A" },
        new Bridge() { ID = "a1", Name = "B" }
    };

Type t = Type.GetType(obj.ToString());
PropertyInfo p = t.GetProperty("Students");

object gg = p.GetValue(obj, null);
var hh = gg.GetType();
string propertyType = string.Empty;

if (hh.IsGenericType)
    {
        string[] propertyTypes = hh.ToString().Split('[');
        Type gggg = Type.GetType(propertyTypes[1].Remove(propertyTypes[1].Length - 1));
        foreach (PropertyInfo pro in gggg.GetProperties())
             {
                 if (pro.Name.Equals("Name"))
                 {
                     // Get the value here
                 }
             }
    } 

2 个答案:

答案 0 :(得分:2)

首先,

Type t = Type.GetType(obj.ToString());

错了。这仅在类没有重载ToString()方法时才有效,如果有,则会在运行时掉落。幸运的是,每个类都有一个GetType()metod(它是在对象上定义的,因此Type t = obj.GetType()是正确的代码。

第二,

string[] propertyTypes = hh.ToString().Split('[');
Type gggg = Type.GetType(propertyTypes[1].Remove(propertyTypes[1].Length - 1)

是获取指定泛型类型的类型的一种糟糕方式,因为有一个方法GetGenericArguments可以为您执行此操作,因此可以使用

更改此代码
Type[] genericArguments = hh.GetGenericArguments();
Type gggg = genericArguments[0];

现在到了真正的问题,访问列表项。最好的方法是使用[]类的索引器(List<>)。在c#中定义索引器时,它会自动转移到名为Item的属性,我们可以使用该属性来提取我们的值(Item名称可以从类型定义中推断出来,但对于大多数情况下,可以硬编码)

PropertyInfo indexer = hh.GetProperty("Item");  // gets the indexer

//note the second parameter, that's the index
object student1 = indexer.GetValue(gg, new object[]{0}); 
object student2 = indexer.GetValue(gg, new object[]{1}); 

PropertyInfo name = gggg.GetProperty("Name");
object studentsName1 = name.GetValue(student1, null); // returns "A"
object studentsName2 = name.GetValue(student2, null); // returns "B"

答案 1 :(得分:0)

覆盖EqualsStudents类的Bridge方法,然后使用Find或使用LINQ