参照:ダイナミックをジェネリックとして使用するにはどうすればよいですか?
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" })
私は途方に暮れています。なぜこの例外が発生するのですか? 簡単に再現できませんでした。これが実際のコードに含まれているすべてであるため、例に他に何を含めればよいかわかりません。
非常に紛らわしい部分は、アプリケーションでこの例外が発生すると、アクションが失敗することです。ただし、ページに再度アクセスして 2 回目の試行を行うと、例外はスローされません。