循环通过Objects属性

时间:2011-03-01 13:04:46

标签: c#

如何循环对象的属性并获取属性的值 我有一个对象,有几个属性填充数据。用户通过提供属性的名称来指定他想要查看的属性,我需要在对象中搜索属性并将其值返回给用户。
 我怎样才能做到这一点?
我写了下面的代码来获取属性,但无法获得该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();
    }

5 个答案:

答案 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)都绑定到类。您必须传入类的实例才能获取任何与实例相关的数据。