通用方法的反映不起作用

时间:2013-07-15 06:05:40

标签: c# generics reflection methods static

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

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

上面的代码给出了非常通用的参数例外。

为上面的代码编写反射的写方式是什么?

1 个答案:

答案 0 :(得分:1)

正如评论中所述:

请注意,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);