2012-04-02 64 views
9

我可以使用Type.InvokeMember通过反射调用一个方法,它看起来很健壮,处理param数组参数。出于某种原因,但它不处理可选参数。通过反射调用可选参数的方法

是否有更好的内置方法调用一个方法(可能使用DLR),确实考虑到可选参数?

+0

您可以调用type.GetMethod(...)来获取MethodInfo实例。然后你可以调用methodInfo.Invoke(),对于可选参数,你可以通过Type.Missing – 2012-04-02 13:55:40

+0

但是这需要我去努力迭代方法的所有可能的实例,并计算出我的参数是否合适参数。基本上手动进行绑定,这是我目前正在做的。看起来,Type.InvokeMember的方式是90%,然后失败。看着重复它出现我卡住做现在手动。 – 2012-04-02 13:57:48

回答

5

在下面的例子中,我们使用两个参数调用一个函数,它不返回任何内容。第二个参数是可选的。

MethodInfo mi = default(MethodInfo); 

// Loading the assembly 
Assembly reflectionAssemby = Assembly.LoadFile(@"C:\RelectionDLL.dll"); 

// Get type of class from loaded assembly 
Type reflectionClassType = reflectionAssemby.GetType("ReflectionDLL.ReflectionClass"); 

// Create instance of the class 
object objReflection = Activator.CreateInstance(reflectionClassType); 

mi = reflectionClassType.GetMethod("pub_Inst_NoReturn_Function"); 
mi.Invoke(objReflection, new object[] { value1, Type.Missing }); 
+1

感谢您的回应。这个问题是,我仍然需要挖掘元数据来确定可选参数是否存在,以便我可以传递Type.Missing。我希望能够在运行时基本复制C#编译器的绑定功能的解决方案。 – 2012-05-04 17:30:58

+0

@JamesGaunt旧的帖子,但你最终找到解决办法吗? – 2016-11-11 19:48:28

+0

哇是很老...我确实找到了一种方法...但只是通过使用Roslyn编译器在运行时直接针对所需的依赖项编译C#。所以没有真正解决同样的问题。但是有可能使用新的编译器功能来编译一些示例代码,然后检查AST以查看它最终绑定的内容。 – 2016-11-14 13:11:17

相关问题