如何基于名称获取属性值


147

有没有一种方法可以根据对象的名称获取对象的属性值?

例如,如果我有:

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;
}

Answers:


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

17
请记住,由于这使用反射,因此速度要慢得多。可能不是问题,但是很高兴知道。
Matt Greer

“无法从字符串转换为BindingFlags”
Christine

5
@MattGreer有“更快”的方式吗?
FizxMike

44

您必须使用反射

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");

您想要GetValue而不是SetValue
Matt Greer'1

我也可以对SetValue这样做吗?怎么样?
Piero Alberto

1
次要的东西-扩展方法可能不需要具有名为car
KyleMit

若要查看如何基于propertyName字符串设置属性值,请参见此处的答案: 通过反射设置属性值
nwsmith

35

你要反思

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

7
+1这是最佳答案,因为您正在显示所有中间对象
Matt Greer

1
除了传递属性值,我还可以传递索引并获取属性名称和值(这样我就可以遍历所有属性)吗?
singhswat

@singhswat您应该将其作为一个新问题提出。
Chuck Savage

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"));
    }

7

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

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");

7

扩展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;
}

如果愿意,您也可以对此进行一些错误处理。


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.