0

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

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中可能吗?

4

3 回答 3

2

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

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

于 2013-07-12T08:02:51.893 回答
0
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);
            }
        }
    }
}
于 2013-07-12T11:30:34.200 回答
0

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

最好的办法还是car.Make = "Volvo";

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

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

这里有2个缺点:

  • 减缓。
  • 编译器无法检查字符串。

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

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

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

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

于 2013-07-12T10:09:41.637 回答