GetOriginalTypeParameterType lève la référence d’object non définie à une instance d’une exception d’object

Référence: Comment utiliser une dynamic en tant que générique?

public void CheckEntity(int entityId, ssortingng entityType = null) { dynamic AnyObject = Activator.CreateInstance("Assembly","Assembly.Models.DbModels." + entityType).Unwrap(); CheckWithInference(AnyObject, entityId); } private static void CheckWithInference(T ignored, int entityId) where T : class { Check(entityId); } private static void Check(int entityId) where T : class { using (var gr = new GenericRepository()) { } } 

Ceci entre avec CheckEntity(16,"Container"); . Après la première ligne, AnyObject devient un Assembly.Models.DbModels.Container vide lorsqu’il est inspecté avec le débogueur. Si var AnyType = AnyObject.GetType(); est utilisé, AnyType indique alors Assembly.Models.DbModels.Container . Cependant, lors de l’appel à CheckWithInference(AnyObject, entityId); est faite une exception est levée.

  • outer: La référence à un object n’est pas définie sur une instance d’object.
  • inner: Microsoft.CSharp.RuntimeBinder.SymbolTable.GetOriginalTypeParameterType (Type t) +10
  • J’ai fait un exemple autonome ici – mais il fonctionne sans erreur 🙁

    Notez que ceci est dans 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, ssortingng entityType = null) { dynamic AnyObject = Activator.CreateInstance("InferenceExample", "InferenceExample.Models." + entityType).Unwrap(); CheckWithInference(AnyObject, entityId); } private static void CheckWithInference(T ignored, int entityId) where T : class { Check(entityId); } private static void Check(int entityId) where T : class { var repo = new List(); } } } 

    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 ssortingng Name { get; set; } } } 

    Index.cshtml

     @{ ViewBag.Title = "Index"; } 

    Index

    @Html.ActionLink("Start", "CheckEntity", new { entityId = 16, entityType = "Example" })

    Je n’arrive pas. Pourquoi ai-je cette exception? Je suis incapable de le reproduire facilement. Je ne sais pas quoi d’autre à inclure pour l’exemple car c’est tout ce que le code actuel contient.

    La partie vraiment déroutante est que dans l’application, lorsque cette exception se produit, l’action échoue. Cependant, en revisitant la page et en essayant une seconde fois, il n’ya pas d’exception.

    Comme indiqué dans l’espace de discussion C #, la solution consiste à contourner entièrement la dynamic et à utiliser la reflection pour appeler la méthode générique. Dynamic a quelques fonctionnalités intéressantes, mais cause parfois plus de problèmes que nécessaire, en particulier lorsqu’il est possible d’obtenir l’object Type au moment de l’exécution.

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

    Heureux de vous aider 🙂