我有一个通用的静态方法,它注册了一个接口,我需要使用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);