C#动态创建datacontext模型的实例

时间:2014-08-01 18:51:54

标签: c# asp.net-mvc

我想动态创建模型的实例并返回如下所示的结果。我怎么能这样做?

public JsonResult GetDetail(string model, int id)
{
    Type type = Type.GetType("MyProject.WebApplication.Models.MyProjctContext." + model);            
    var result = (type)Activator.CreateInstance(type).Find(id);

    return Json(new
    {
        data = result
    },
    JsonRequestBehavior.AllowGet);
}

2 个答案:

答案 0 :(得分:1)

var result = (type)Activator.CreateInstance(type).Find(id);
  1. CreateInstance(Type)会返回一个对象,该对象不包含我认为可以在模型上找到的Find(int)方法。
  2. 您不能通过类型变量键入强制转换,除非它是泛型方法或泛型类方法中的指定类型。
  3. 这可以通过使用reflexion,interface:

    来解决
        public JsonResult GetDetail(string modelTypeName, int id)
        {
            var type = Type.GetType("MyProject.WebApplication.Models.MyProjctContext." + modelTypeName);            
    
            //reflection way
            var model = Activator.CreateInstance(type);
            var result = (*find method return type*)type.GetMethod("Find", new Type[] { int }).Invoke(model, new object[] { id });
    
            //constraint way : with constraint being an interface or a base class that defines .Find(int)
            var result = ((*constraint*)Activator.CreateInstance(type)).Find(id);
    
    
            return Json(new
                {
                    data = result
                },
                JsonRequestBehavior.AllowGet);
        }
    

    或使用动态,如Marnix van Valen所说。

答案 1 :(得分:1)

此代码中唯一真正的问题是强制转换为type。如果您的数据访问层将使用方法object Find(int id)实现接口,则可以简单地转换为该接口。否则我建议转换为dynamic并让调用在运行时解决。

public JsonResult GetDetail(string model, int id)
{
    Type type = Type.GetType("MyProject.WebApplication.Models.MyProjctContext." + model);            
    var result = ((dynamic)Activator.CreateInstance(type)).Find(id);

    return Json(new
    {
        data = result
    },
    JsonRequestBehavior.AllowGet);
}

关于此代码的几点评论:

  • 表现可能不会很棒。
  • 如果类型未实现Find(int)方法
  • ,此代码将会爆炸
  • 认真思考此代码的安全隐患。至少,通过此操作限制可以请求的实体。