将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方法泛型中的两个类型。目前,我收到了错误,因为我传入了泛型变量,而不是对象类型
有什么办法可以解决我的问题吗?
如果依赖容器有一个非泛型方法,那么调用它:
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.