动态创建模型对象时在模型中设置值

时间:2012-04-03 09:08:34

标签: asp.net-mvc-3 c#-4.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”的类型覆盖。我看了创建一个接口,但我甚至不知道这些是如何工作的,2(可能是因为1)我甚至无法创建一种没有构建错误的方法。

当单步执行代码时,我可以使用quickwatch或intellisense或其他任何名称来查看“o”的所有属性。显然它被认为是正确的类型。我似乎无法调用该方法,因为它仅在运行期间在构建期间不是可识别的(或设置)类型,因此我无法构建解决方案。

2 个答案:

答案 0 :(得分:0)

我要做的是为具有CommonProperty属性的视图模型创建一个基本模型(例如:BaseModel),然后检查模型是否为BaseModel类型,然后设置属性

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

答案 1 :(得分:0)

事实证明我是在过度思考这个问题。通常,答案非常简单。没有必要的基本模型,没有覆盖,没有虚拟,没有实例,将它转储到try catch中,只需设置上下文对象的值。

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

我必须确保在设置当前值之前设置状态,否则它不在上下文中(或类似的东西)。