参考: 如何动态地作为一种通用的?
public void CheckEntity(int entityId, string entityType = null)
{
dynamic AnyObject = Activator.CreateInstance("Assembly","Assembly.Models.DbModels." + entityType).Unwrap();
CheckWithInference(AnyObject, entityId);
}
private static void CheckWithInference<T>(T ignored, int entityId) where T : class
{
Check<T>(entityId);
}
private static void Check<T>(int entityId) where T : class
{
using (var gr = new GenericRepository<T>())
{
}
}
这个输入与CheckEntity(16,"Container");
。 第一线运行后, AnyObject
变为空白Assembly.Models.DbModels.Container
当与调试器检查。 如果var AnyType = AnyObject.GetType();
被使用,然后AnyType
显示为Assembly.Models.DbModels.Container
。 然而,当调用CheckWithInference(AnyObject, entityId);
由一个异常被抛出。
我在这里做了一个自包含的例子 - 但它在运行时错误:(
请注意,这是在asp.net MVC 3 C#
HomeController.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace InferenceExample.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
public void CheckEntity(int entityId, string entityType = null)
{
dynamic AnyObject = Activator.CreateInstance("InferenceExample", "InferenceExample.Models." + entityType).Unwrap();
CheckWithInference(AnyObject, entityId);
}
private static void CheckWithInference<T>(T ignored, int entityId) where T : class
{
Check<T>(entityId);
}
private static void Check<T>(int entityId) where T : class
{
var repo = new List<T>();
}
}
}
Example.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace InferenceExample.Models
{
public class Example
{
public int ExampleId { get; set; }
public string Name { get; set; }
}
}
Index.cshtml
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@Html.ActionLink("Start", "CheckEntity", new { entityId = 16, entityType = "Example" })
我很茫然。 为什么我得到这个例外? 我无法轻松地重现。 我不知道还有什么包括的例子,因为这是所有的实际代码中有。
真正令人困惑的是,在应用中,当此异常发生时,操作失败。 然而,在重新审查页面,并试图第二次,没有异常抛出。