如何按名称访问属性

本文关键字:属性 访问 何按名 | 更新日期: 2023-09-27 18:22:14

这是一个关于如何更新数据库中的值的简单示例:

var context = new dbEntities();
var car = context.CarTable.Where(p => p.id == id).FirstOrDefault();
car.Make = "Volvo";
context.SaveChanges();

然而,我现在需要做的是按名称获取房产。所以这就是我理论上想做的:

var context = new dbEntities();
var car = context.CarTable.Where(p => p.id == id).FirstOrDefault();
**car["Make"] = "Volvo";**
context.SaveChanges();

这在EF中可能吗?

如何按名称访问属性

我不会使用反射,因为这会很慢。

可以使用表达式树,尤其是在缓存表达式时。请查看此链接以获取有关它的文章。我会在文章中的代码周围编写一个包装器,它接受一个对象和一个propertyname(字符串),使用文章中的编码创建/缓存func(或从缓存中检索它),并执行func。

主要的问题是你为什么需要这个?

最好的方法仍然是car.Make = "Volvo";

如果强烈需要字符串名称,可以使用反射:

var property = typeof (Car).GetProperty("Make");
property.SetValue(car, "BMW", null);

这里有两个缺点:

  • 慢一点
  • 编译器无法检查字符串

另一种方式-您可以使用索引器和开关:

 public class Car
    {
        public string Make { get; set; }
        public string this[String name]
        {
            set
            {
                switch (name)
                {
                    case "Make":
                        Make = value;
                        break;
                    ...
                }
            }
        }
    }

然后只有car["Make"] = "Volvo";它更快,但会出现一个典型的问题:您必须解析字符串或使用对象进行操作。

public class Car
{
    public string Make { get; set; }
    public object this[string name]
    {
        get
        {
            var property = this.GetType().GetProperties().FirstOrDefault(p => p.Name.Equals(name));
            if (property != null)
            {
                return property.GetValue(this, null);
            }
            return null;
        }
        set
        {
            var property = this.GetType().GetProperties().FirstOrDefault(p => p.Name.Equals(name));
            if (property != null)
            {
                property.SetValue(this, value, null);
            }
        }
    }
}