我想动态创建模型的实例并返回如下所示的结果。我怎么能这样做?
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);
}
答案 0 :(得分:1)
var result = (type)Activator.CreateInstance(type).Find(id);
CreateInstance(Type)
会返回一个对象,该对象不包含我认为可以在模型上找到的Find(int)
方法。这可以通过使用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)
方法