参考:动态如何用作泛型?
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; }
}
}
索引.cshtml
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@Html.ActionLink("Start", "CheckEntity", new { entityId = 16, entityType = "Example" })
我很茫然。为什么会出现这个异常?我无法轻松地复制它。我不确定该示例还包括什么,因为这就是实际代码中包含的所有内容。
真正令人困惑的部分是,在应用程序中,当发生此异常时,操作将失败。但是,在重新访问该页面并再次尝试时,没有抛出异常。