2012-04-03 68 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