如何根据名称获取属性值

时间:2011-04-01 00:41:30

标签: c# asp.net reflection

有没有办法根据对象的名称获取对象的属性值?

例如,如果我有:

public class Car : Vehicle
{
   public string Make { get; set; }
}

var car = new Car { Make="Ford" };

我想写一个方法,我可以传入属性名称,它将返回属性值。即:

public string GetPropertyValue(string propertyName)
{
   return the value of the property;
}

7 个答案:

答案 0 :(得分:263)

return car.GetType().GetProperty(propertyName).GetValue(car, null);

答案 1 :(得分:38)

你必须使用反射

public object GetPropertyValue(object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

如果你想要真正的幻想,你可以使它成为一种扩展方法:

public static object GetPropertyValue(this object car, string propertyName)
{
   return car.GetType().GetProperties()
      .Single(pi => pi.Name == propertyName)
      .GetValue(car, null);
}

然后:

string makeValue = (string)car.GetPropertyValue("Make");

答案 2 :(得分:31)

你想要反思

Type t = typeof(Car);
PropertyInfo prop = t.GetProperty("Make");
if(null != prop)
return prop.GetValue(this, null);

答案 3 :(得分:7)

简单示例(客户端没有写反射硬代码)

class Customer
{
    public string CustomerName { get; set; }
    public string Address { get; set; }
    // approach here
    public string GetPropertyValue(string propertyName)
    {
        try
        {
            return this.GetType().GetProperty(propertyName).GetValue(this, null) as string;
        }
        catch { return null; }
    }
}
//use sample
static void Main(string[] args)
    {
        var customer = new Customer { CustomerName = "Harvey Triana", Address = "Something..." };
        Console.WriteLine(customer.GetPropertyValue("CustomerName"));
    }

答案 4 :(得分:3)

此外其他人回答说,它很容易通过使用扩展方法得到任何对象的属性值,如:

public static class Helper
    {
        public static object GetPropertyValue(this object T, string PropName)
        {
            return T.GetType().GetProperty(PropName) == null ? null : T.GetType().GetProperty(PropName).GetValue(T, null);
        }

    }

用法是:

Car foo = new Car();
var balbal = foo.GetPropertyValue("Make");

答案 5 :(得分:3)

扩展Adam Rackis的答案 - 我们可以简单地将扩展方法设为通用:

public static TResult GetPropertyValue<TResult>(this object t, string propertyName)
{
    object val = t.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(t, null);
    return (TResult)val;
}

如果你愿意的话,你也可以抛出一些错误处理。

答案 6 :(得分:2)

为避免反射,您可以在属性值部分中将属性名称作为键和函数来设置一个属性字典,以从您请求的属性中返回相应的值。