7

参照:ダイナミックをジェネリックとして使用するにはどうすればよいですか?

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();AnyTypeAssembly.Models.DbModels.ContainerCheckWithInference(AnyObject, entityId);

  • 外部: オブジェクト参照がオブジェクトのインスタンスに設定されていません。
  • 内部: Microsoft.CSharp.RuntimeBinder.SymbolTable.GetOriginalTypeParameterType(Type t) +10

    ここで自己完結型の例を作成しました-しかし、エラーなしで実行されます:(

    これは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 回目の試行を行うと、例外はスローされません。

  • 4

    1 に答える 1

    3

    C# チャット ルームで説明したように、ここでの解決策は、動的を完全にバイパスし、リフレクションを使用してジェネリック メソッドを呼び出すことです。Dynamic にはいくつかの優れた機能がありますが、実行時に Type オブジェクトを取得できる場合は特に、必要以上に問題が発生することがあります。

    var modelType = Type.GetType("InferenceExample.Models." + entityType + ",InferenceExample");
    
    var checkMethod = typeof(HomeController).GetMethod("CheckWithInference", BindingFlags.NonPublic | BindingFlags.Static);
    checkMethod.MakeGenericMethod(modelType).Invoke(null, new object[] { entityId });
    

    喜んでお手伝いします:)

    于 2012-08-23T19:53:47.973 に答える