我需要从嵌套属性中获取值。
在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
}
}
}
答案 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)
覆盖Equals
和Students
类的Bridge
方法,然后使用Find
或使用LINQ