如何按名称访问属性
本文关键字:属性 访问 何按名 | 更新日期: 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);
}
}
}
}