asp.net 如何根据名称获取属性值

iaqfqrcu  于 2023-02-01  发布在  .NET
关注(0)|答案(8)|浏览(171)

有没有一种方法可以根据一个对象的名字来获取它的属性值?
例如,如果我有:

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

xoefb8l81#

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

wqnecbli2#

你得用反射

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

lrpiutwd3#

你想要反思

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

plicqrtu4#

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

如果愿意,您也可以围绕它进行一些错误处理。

f0brbegy

f0brbegy5#

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

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

ijxebb2r6#

简单示例(无需在客户端中编写反射硬代码)

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

csga3l587#

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

gr8qqesn

gr8qqesn8#

2个非常短的选项,1个在失败时使用默认值:

public object GetPropertyValue_WithDefault(
    object _t,
    string _prop,
    object _default = null
)
{
    PropertyInfo pi = _t.GetType().GetProperty(_prop);
    return (pi == null
        ? _default
        : pi.GetValue(_t, null)
    );
}

public object GetPropertyValue(object _t, string _prop)
{
    //because of "?." will return null if property not found
    return _t.GetType().GetProperty(_prop)?.GetValue(_t, null); 
}

相关问题