为什么MakeGenericType会在它创建的类型中添加反引号?

时间:2012-09-06 04:40:09

标签: c# unity-container

所以我放弃了“ASP.NET MVC 2 In Action book”中的演示。没有任何真正的理由只是玩它。我试图用一个真正的IOC容器实现一个例子(他们在示例代码中使用的那个是假的,当然会工作)。我遇到的问题是MakeGenericType返回一个奇怪的类型,名称后面有一个勾号1。我查看了这个问题What does a backtick in a type name mean in the Visual Studio debugger?,这似乎表明它仅用于显示目的?但它似乎并不那样。这是我的代码。

//here are the ways I tried to register the types
 private static void InitContainer()
 {
     if (_container == null)
     {
         _container = new UnityContainer();
     }
     _container.RegisterType<IMessageService, MessageService>();
     _container.RegisterType<IRepository, Repository>();
     _container.RegisterType(typeof(IRepository<Entity>), typeof(Repository<Entity>));
  }

以下是我试图实现的模型绑定器的代码。

public class EntityModelBinder: IFilteredModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value == null)
            return null;
        if (string.IsNullOrEmpty(value.AttemptedValue))
            return null;
        int entityId;
        if (!int.TryParse(value.AttemptedValue, out entityId))
            return null;
        Type repoType = typeof (IRepository<>).MakeGenericType(bindingContext.ModelType);
        var repo = (IRepository)MvcApplication.Container.Resolve(repoType, repoType.FullName, new ResolverOverride[0]);
        Entity entity = repo.GetById(entityId);
        return entity;
    }

    public bool IsMatch(Type modelType)
    {
        return typeof (Entity).IsAssignableFrom(modelType);
    }
}

对container.resolve的调用总是会出现这个错误:

依赖关系的解析失败,type =“MvcModelBinderDemo.IRepository`1 [MvcModelBinderDemo.Entity]”,name =“MvcModelBinderDemo.IRepository`1 [[MvcModelBinderDemo.Entity,MvcModelBinderDemo,Version = 1.0.0.0,Culture = neutral,公钥=空]]”。 在解决时发生异常。

另外 - 我确实知道将MvcApplication的引用放在ModelBinder中有点草率,只是试图找出工作方式和进入容器所需的工作方式。

感谢您的任何意见。

1 个答案:

答案 0 :(得分:1)

我认为问题在于您在Resolve中明确指定了名称。请尝试删除第二个参数repoType.FullName

尝试使用MvcApplication.Container.Resolve(repoType);。不要忘记在* .cs文件的顶部添加using Microsoft.Practices.Unity;

在您关联的问题中已经回答了反引号的含义。但是,你的结论是不正确的。它不仅仅用于显示目的。带反引号的名称是您班级的CLR名称 这不是你问题的根源。