这是一个关于如何更新数据库中的值的简单示例:
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吗?
答案 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);
}
}
}
}