GetOriginalTypeParameterType抛出不设置到对象异常的实例对象引用(GetO

2019-06-27 07:06发布

参考: 如何动态地作为一种通用的?

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); 由一个异常被抛出。

  • 外:对象没有设置为一个对象的一个​​实例。
  • 内:Microsoft.CSharp.RuntimeBinder.SymbolTable.GetOriginalTypeParameterType(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; }
    }
    }
    

    Index.cshtml

    @{
    ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    @Html.ActionLink("Start", "CheckEntity", new { entityId = 16, entityType = "Example" })
    

    我很茫然。 为什么我得到这个例外? 我无法轻松地重现。 我不知道还有什么包括的例子,因为这是所有的实际代码中有。

    真正令人困惑的是,在应用中,当此异常发生时,操作失败。 然而,在重新审查页面,并试图第二次,没有异常抛出。

  • Answer 1:

    如在C#聊天室所讨论的,这里的解决方案是完全绕过动态和使用反射来调用通用方法。 动态有一些不错的功能,但有时会造成更多的麻烦比它的价值,特别是当它有可能在运行时获取类型的对象。

    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 });
    

    乐意效劳 :)



    文章来源: GetOriginalTypeParameterType throws Object reference not set to an instance of an object exception