2012-04-03 148 views
0

我有一堆模型,可能有也可能沒有「CommonProperty」屬性。我想在創建選定模型的新對象時設置該屬性。我到目前爲止,其工作原理是:動態創建模型對象時在模型中設置值

ModuleItem model = db.ModuleItems.Find(ModuleItemID); 
object o = GetModuleType(model.ControllerName); 

private object GetModuleType(string ModelName) 
{ 
string projectName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; 

Type classtype = Type.GetType(string.Format("{0}.Models.{1}", projectName, ModelName)); 
PropertyInfo[] properties = classtype.GetProperties(); 
var classObject = classtype.GetConstructor(new Type[] { }).Invoke(null); 
return classObject; 

}

我想實現的是設置CommonProperty:

o.CommonProperty = DistinctValue; 

我試圖創建一個類,我所有的車型繼承從一個虛擬的方法,每個模型然後有一個覆蓋方法。因爲它不是靜態的,我不能直接調用它,如果我創建一個新的ModelBase,那麼當調用方法時,它不會被對象「o」所在的類型覆蓋。我看着創建一個接口,但1我甚至不知道這些如何工作,2(可能是因爲1)我甚至無法創建一個沒有生成錯誤的方法。

單步執行代碼時,我可以使用quickwatch或智能感知或任何它所謂的任何方法查看「o」的所有屬性。顯然它被認爲是正確的類型。雖然我似乎無法調用該方法,因爲它僅在運行期間不會被識別(或設置)類型,因此我無法構建解決方案。

回答

0

事實證明我的ViewModels(如BaseModel)這種方式超過了這個方式。通常,答案是非常簡單的。沒有必要的基礎模型,沒有覆蓋,沒有虛擬化,沒有實例,將它轉儲到try catch中並只設置上下文對象的值。

 object o = GetModuleType(model.ControllerName); 
     db.Entry(o).State = EntityState.Added; 
     try 
     { 
      db.Entry(o).CurrentValues["CommonProperty"] = DistinctValue; 
     } 
     catch (Exception err) { } 

我確實要確保我設置了狀態BEFORE設置當前值,否則它不在上下文中(或類似的情況)。

0

我會做的是創建一個基本模型:對於具有財產CommonProperty然後檢查模型是否型BaseModel的然後將該屬性設置

if (obj is BaseModel) 
{ 
    obj.CommonProperty = DistinctValue; 
} 
+0

我不太明白。這不是什麼「我嘗試創建一個類,我的所有模型都使用虛擬方法繼承,然後每個模型都有一個覆蓋方法。」手段?如果不是,我如何創建一個可以控制其他模型的BaseModel? – 2012-04-03 21:59:49

+0

我不這麼認爲。你應該只繼承你需要屬性CommpnProperty的BaseModel,例如如果你有兩個類A和B,那麼如果只需要A來讓屬性從BaseModel繼承A,那麼你可以同時擁有A和B一個列表,然後當你需要檢查屬性時,你可以應用上面的代碼,它只會嘗試設置A的屬性,因爲A是繼承BaseModel的唯一類 – Jayanga 2012-04-04 04:21:04

相關問題