我有一个通用的静态方法来注册一个接口,我需要使用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
上面的代码给出了非常通用的参数例外。
为上面的代码编写反射的写方式是什么?
答案 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);