如何按名称访问属性?

时间:2013-07-12 07:47:07

标签: c# .net entity-framework

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

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吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

如果强烈需要string-name,您可以使用Reflection:

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"; 它更快,但会出现类型问题:您必须解析字符串或使用对象操作。

答案 2 :(得分: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);
            }
        }
    }
}