首页 > 解决方案 > 如何使用变量作为类型

问题描述

我想根据程序集(“OneOfMyAssemblies”)中的某种类型初始化一个统一容器。我想注册所有类型(类)继承一个特定的接口(“IInjectionMarker”)。我得到了它们,我创建了一个变量,但我不能将它们用作一种类型。问题出在:

unityContainer.RegisterType<interfaceName, typeName> (new InjectionConstructor("MyParameter"));

我收到错误“不能将变量用作类型”。我该如何解决这个问题?

var types = new List<Type>();

types.AddRange(Assembly.Load("OneOfMyAssemblies")
    .GetTypeListImplementingTheInterface(typeof(IInjectionMarker)));

types.ForEach(h =>
{
    Type typeName= Type.GetType(h.Name, true);
    Type interfaceName = Type.GetType($"I{h.Name}", true);

    unityContainer.RegisterType<interfaceName, typeName> (
        new InjectionConstructor("MyParameter"));

});

标签: c#dependency-injectionunity-container

解决方案


不幸的是,您不能将类型用于这样的泛型方法。

选项 1:使用非泛型方法

在简要检查文档后,我发现这RegisterType<TFrom, TTo>(IUnityContainer, InjectionMember[])只是 IUnityContainer 的扩展方法,您可以使用 IUnityContainer 的一种方法,即RegisterType(Type, Type, String, ITypeLifetimeManager, InjectionMember[])有关所有参数的更多详细信息,请查看链接到一些统一文档的文档

应该像这样工作:

Type toType = Type.GetType(h.Name, true);
Type fromType = Type.GetType($"I{h.Name}", true);

unityContainer.RegisterType(fromType, toType, null, null, new InjectionConstructor("MyParameter"));

选项 2:通过反射生成泛型方法

如果真的想使用通用扩展方法,我建议您参考这个答案,它将展示如何生成和调用这种方法: https ://stackoverflow.com/a/232621/5991722


推荐阅读