泛型方法的反射不起作用

本文关键字:不起作用 反射 泛型方法 | 更新日期: 2023-09-27 18:22:23

我有一个通用的静态方法,它注册了一个接口,我需要使用c#反射来编写它。

Services.AddService<ITBroker>(new TBrokerService());

我尝试了以下代码,但它不工作

Type[] externTBrokerService = Assembly.LoadFrom("Business.dll").GetTypes();
Type[] externService = Assembly.LoadFrom("ServiceModel.dll").GetTypes();
Type iTBroker = externITBroker[12];
MethodInfo method = externService[1].GetMethods()[2];
//Gets Add Service method
MethodInfo generic = method.MakeGenericMethod(iTBroker);
//Make method generic           
generic.Invoke(null,new object[] { externTBrokerService[0]});
//invoke the service

上面的代码给了我一个非常通用的参数异常。

对于上面的代码,写反射的方法是什么?

泛型方法的反射不起作用

如注释所示:

注意,externTBrokerService[0]Type,而不是该类型的实例。

有了这些,我觉得有必要把其他评论作为我答案的一部分。

Type iTBroker = externITBroker[12];

这是错误的!这迟早会找不到你的类型,因为这个集合中类型的顺序是不确定的,并且可能会更改。你应该这样做:

Type iTBroker = externITBroker.Single(x => x.Name == "ITBroker");

这远不是万无一失的,所以要确保这个条件给你唯一的结果。

或者直接加载该类型(假设这是您的类型的AssemblyQualifiedName):

Type.GetType("Business.ITBroker, Business");

要在您的类型上查找方法,有一个方法Type.GetMethod,它的一个重载将足以查找您的方法。

要创建需要作为参数传递的类型的实例,可以使用

Activator.CreateInstance(brokerServiceType);