将Type传递给具有泛型的方法

本文关键字:泛型 方法 Type | 更新日期: 2023-09-27 18:30:07

嗨,我正试图围绕Unity创建一个通用包装器,使我能够在不需要的情况下随时更改IoC框架

public static void RegisterTypes(IDependencyInjectionContainerWrapper container)
    {
        List<Type> types = LoadTypesFromAssemblies();
        foreach (var type in types)
        {
            var interfaceType= type.CustomAttributes
                                 .FirstOrDefault(a => a.AttributeType.Name == typeof(DependencyService).Name)
                                 .ConstructorArguments[0].Value;
            container.RegisterType<type, interfaceType>();
        }
    }

这里发生的事情是,我正在获得一个列表类型,属性为DependencyService is applyed。

然后我对它进行迭代,得到该属性的第一个构造函数参数。

然后我尝试在容器中注册抛出泛型的类型。这就是我遇到问题的地方。

我不知道如何传递RegisterType方法泛型中的两个类型。目前,我收到了错误,因为我传入了泛型变量,而不是对象类型

有什么办法可以解决我的问题吗?

将Type传递给具有泛型的方法

如果依赖容器有一个非泛型方法,那么调用它:

container.RegisterType(type, interfaceType);

如果它没有非泛型方法,并且你可以修改源代码,我强烈建议提供一个;这让这类事情变得容易多了。通常,使用这样的容器,您的通用方法最终会调用非通用方法:

public void RegisterType(Type implType, Type ifaceType)
{
    ...
}
public void RegisterType<TImpl, TIface>() where TImpl : TIface
{
    this.RegisterType(typeof(TImpl), typeof(TIface));
}

否则,您将不得不通过反射动态提供通用参数:

var methodInfo = container.GetType().GetMethod("RegisterType");
var actualMethod = methodInfo.MakeGenericMethod(type, interfaceType);
methodInfo.Invoke(container);

但这既不高效,也不特别优雅。

使用MethodInfo.MakeGenericMethod.