我可以使用Type.InvokeMember
通過反射調用一個方法,它看起來很健壯,處理param數組參數。出於某種原因,但它不處理可選參數。通過反射調用可選參數的方法
是否有更好的內置方法調用一個方法(可能使用DLR),確實考慮到可選參數?
我可以使用Type.InvokeMember
通過反射調用一個方法,它看起來很健壯,處理param數組參數。出於某種原因,但它不處理可選參數。通過反射調用可選參數的方法
是否有更好的內置方法調用一個方法(可能使用DLR),確實考慮到可選參數?
在下面的例子中,我們使用兩個參數調用一個函數,它不返回任何內容。第二個參數是可選的。
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 });
感謝您的迴應。這個問題是,我仍然需要挖掘元數據來確定可選參數是否存在,以便我可以傳遞Type.Missing。我希望能夠在運行時基本複製C#編譯器的綁定功能的解決方案。 – 2012-05-04 17:30:58
@JamesGaunt舊的帖子,但你最終找到解決辦法嗎? – 2016-11-11 19:48:28
哇是很老...我確實找到了一種方法...但只是通過使用Roslyn編譯器在運行時直接針對所需的依賴項編譯C#。所以沒有真正解決同樣的問題。但是有可能使用新的編譯器功能來編譯一些示例代碼,然後檢查AST以查看它最終綁定的內容。 – 2016-11-14 13:11:17
您可以調用type.GetMethod(...)來獲取MethodInfo實例。然後你可以調用methodInfo.Invoke(),對於可選參數,你可以通過Type.Missing – 2012-04-02 13:55:40
但是這需要我去努力迭代方法的所有可能的實例,並計算出我的參數是否合適參數。基本上手動進行綁定,這是我目前正在做的。看起來,Type.InvokeMember的方式是90%,然後失敗。看着重複它出現我卡住做現在手動。 – 2012-04-02 13:57:48