2013-07-12 109 views
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?

+8

您可以通過反射做到這一點,但它是不推薦的,因爲它的速度很慢(http://stackoverflow.com/questions/1196991/get-property-value-from-string-using-reflection-in -c-sharp和http://stackoverflow.com/questions/619767/net-reflection-set-object-property) – derape

+5

你爲什麼要這麼做? – Satpal

+0

爲什麼你需要名稱屬性? – Bas

回答

2

我不會使用反射,因爲這會很慢。

您可以使用表達式樹,尤其是在緩存表達式時。檢查this link有關它的文章。我會在文章中的代碼中編寫一個包裝,其中包含一個對象和一個屬性名(字符串),使用文章中的代碼創建/緩存func(或從緩存中檢索),然後執行func。

+0

我不明白這與反射有什麼不同..它肯定仍然是反射..只是與緩存的'PropertyInfo'實例。 –

+0

表達式樹的創建確實涉及反射(您必須檢索propertyinfo)。但是,一旦你有了編譯的表達式樹,就不需要反射了,只需執行編譯後的表達式樹。那麼,什麼給你更好的表現是反射的單一用法來創建一個編譯表達式樹,而反射的持續使用則使用反射來檢索/設置一個屬性值。一旦編譯表達式樹,它就快得多,就像在代碼中直接獲取/設置屬性值一樣快。 – Maarten

+0

您應該緩存編譯的表達式樹(結果'Func '和'Action '值),而不是'PropertyInfo'實例。 – Maarten

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"; 它的速度更快,但出現典型值-問題:你要解析的字符串或對象進行操作。

+0

而不是交換機只使用反射來獲取屬性。 –

+0

這是關於如何避免反射。 – arctangent

0
​​