2014-07-11 24 views
1

我想打電話從反射的方法調用後,使用反射與GUID參數的方法:使用CodeDomCompiler編譯裝配

bool ApproveUser(Guid userId) 

我使用的.NET組件CodeDomCompiler編譯組件,其中,類包含方法駐留,並且方法正在編譯爲

{Void ApproveUser(System.String, Boolean ByRef, Boolean ByRef)} 

這與我所期望的完全不同。這是Guid參數和返回類型轉換成類似這樣的正常行爲?任何暗示是讚賞。謝謝!

編輯:調用方法:

Guid request = new Guid("25867C0D-F2FB-6A6A-AC61-FF0000852B58"); 
object[] args = new object[1] { request }; 
object classInstance= compilerResults.CompiledAssembly.CreateInstance("FooClass"); 
MethodInfo methodInfo = classInstance.GetType().GetMethod("ApproveUser"); 
bool result = (bool)methodInfo.Invoke(classInstance, args); 

我期望的方法獲得成功調用,而不是我收到以下異常:

An exception of type 'System.Reflection.TargetParameterCountException' occurred in mscorlib.dll but was not handled in user code 
Additional information: Parameter count mismatch. 

編輯2:我從改變參數類型Guidint

public bool ApproveUser(int smthg) 

T現在他編譯的版本是

{Void ApproveUser(Int32, Boolean, Boolean ByRef, Boolean ByRef)} 
+4

我認爲你正在尋找兩種完全不同的方法 –

+5

「我試圖從反射中調用一種方法」 - 請告訴我們究竟如何 –

+0

@SergeyBerezovskiy我也這麼認爲,但該組件內只有一個這樣的方法 –

回答

2

嘗試使用GetMethodthis overload

var methodInfo = classInstance.GetType() 
       .GetMethod("ApproveUser", new[] { typeof(Guid) }); 

如果你的方法是私有的嘗試指定BindingFlags

var methodInfo = classInstance.GetType() 
       .GetMethod("ApproveUser", BindingFlags.Instance | BindingFlags.NonPublic); 
+0

'methodInfo'在這種情況下'null' –

+0

@AlexBarac then:你想要的方法不存在;看看那裏是什麼('GetMethods') - 我們不能從這裏知道 –

+0

@MarcGravell我完全同意你的觀點,我想要的不在那裏。除了.NET提供的方法外,還有什麼是我在問題中提到的。 –

0

經過更多的測試,我發現,當參數是原始類型時,來自CodeDomProviderCompileAssemblyFromDom方法表現怪異結構內的結構。因此,當在方法中設置爲返回類型或參數類型時,string,int等以及它們的通信者String,Int32和可爲空的版本以及Guid將被轉換爲類似於問題中提及的內容。我也有不同的隨機類測試,並且僅使用真正的類時,方法頭將類似於原來,:

StreamWriter ApproveUser(Stream smthg) 

將被編譯到

{System.IO.StreamWriter ApproveUser(System.IO.Stream)} 

這使我的想法,如果我使用object而不是我正在使用的基本類型,編譯結果會令人滿意。事實上,

object ApproveUser(object userId) 

將被編譯到

{System.Object ApproveUser(System.Object)} 

,然後通過反射我希望它是的方式訪問。 顯然這是CodeDomProvider提供的編譯過程中的一些問題。希望這可以幫助其他人。