如何循环对象的属性并获取属性的值
我有一个对象,有几个属性填充数据。用户通过提供属性的名称来指定他想要查看的属性,我需要在对象中搜索属性并将其值返回给用户。
我怎样才能做到这一点?
我写了下面的代码来获取属性,但无法获得该prop的值:
public object FindObject(object OBJ, string PropName)
{
PropertyInfo[] pi = OBJ.GetType().GetProperties();
for (int i = 0; i < pi.Length; i++)
{
if (pi[i].PropertyType.Name.Contains(PropName))
return pi[i];//pi[i] is the property the user is searching for,
// how can i get its value?
}
return new object();
}
答案 0 :(得分:8)
试试这个(代码插入内联):
public object FindObject(object OBJ, string PropName)
{
PropertyInfo[] pi = OBJ.GetType().GetProperties();
for (int i = 0; i < pi.Length; i++)
{
if (pi[i].PropertyType.Name.Contains(PropName))
{
if (pi[i].CanRead) //Check that you can read it first
return pi[i].GetValue(OBJ, null); //Get the value of the property
}
}
return new object();
}
答案 1 :(得分:6)
要从PropertyInfo
获取值,请致电GetValue
:)我怀疑您确实想要获取该属性的名称 type < / em>请注意。我怀疑你想要:
if (pi[i].Name == PropName)
{
return pi[i].GetValue(OBJ, null);
}
请注意,您应该确保该属性不是索引器,并且可读且可访问等.LINQ是过滤事物的好方法,或者您可以使用Type.GetProperty
直接进入具有所需名称的属性,而不是循环 - 然后然后执行您需要的所有验证。
您还应该考虑遵循命名约定并使用foreach
循环。哦,如果找不到属性,我可能会返回null或抛出异常。我看不出返回一个新的空物体是个好主意。
答案 2 :(得分:2)
pi[i].GetValue(OBJ,null);
是要使用的功能。
答案 3 :(得分:1)
public static object FindObject(object obj, string propName)
{
return obj.GetType().GetProperties()
.Where(pi => pi.Name == propName && pi.CanRead)
.Select(pi => pi.GetValue(obj, null))
.FirstOrDefault();
}
答案 4 :(得分:0)
您调用传递对象的PropertyInfo.GetValue方法来获取值。
public object FindObject(object OBJ, string PropName)
{
PropertyInfo[] pi = OBJ.GetType().GetProperties();
for (int i = 0; i < pi.Length; i++)
{
if (pi[i].Name == PropName)
{
return pi[i].GetValue(OBJ, null);
}
}
return new object();
}
所有反射类型(包括PropertyInfo)都绑定到类。您必须传入类的实例才能获取任何与实例相关的数据。