2012-03-07 127 views
2

我有一個方法,如下圖所示...如何使用反射來調用了一個字符串數組作爲參數,在C#中的方法

public bool MakeRequest(string[] args) 
    { 
     try 
     { 
      sXmlRequest = args[0]; 
      sResponse = ""; 
      Console.WriteLine(sXmlRequest); 
      sw.Write(sXmlRequest); 
      sw.Flush(); 
      sResponse = sr.ReadToEnd(); 
      return true; 
     } 
     catch (Exception e) 
     { 
      sResponse = e.Message; 
      return false; 
     } 

    } 

我必須調用使用反射這種方法,因爲路整個框架已經建立。

這裏是我使用叫它

string[] innerargs = {"Dummy Args"}; 
string pAssembly = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\TCPConnector.dll"; 
Assembly assemblyInstance = Assembly.LoadFrom(pAssembly); 
Type tConnector = assemblyInstance.GetType("Fit.TcpConnector"); 
Object oLateBound = assemblyInstance.CreateInstance(tConnector.FullName); 

result = tConnector.InvokeMember("MakeRequest", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, oLateBound, innerargs); 

這回我的代碼MissingMethodException說Fit.TcpConnector.MakeRequest沒有找到方法。

但是,如果我改變makeRequest的簽名,以

public bool MakeRequest(string args) 

,而不是

public bool MakeRequest(string[] args) 

那麼,這是工作。在調用以數組爲參數的函數時,任何人都可以指向正確的方向嗎?

+0

你爲什麼使用匈牙利符號?這不是很有用,因爲編譯器已經檢查了類型。 – svick 2012-03-07 15:55:28

+0

我一直在想同一個。可能是太多的vbscripting讓我跟着它。但是,現在我感覺我不應該這樣做。你的問題激勵我重新考慮離開這個符號。 – Buddha 2012-03-07 16:03:16

回答

5

你要通過它包含您的數組的數組:

tConnector.InvokeMember(
    "MakeRequest", 
    BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, 
    null, oLateBound, new object[] { innerargs }); 

那是因爲你傳遞給方法的陣列中的每個項目代表一個參數的函數。由於你的函數有一個string[]類型的參數,你需要給它一個數組,其中包含一個string[]類型的項。

話雖這麼說,我想用GetMethod()Invoke()是清楚不過InvokeMember()

var makeRequestMethod = tConnector.GetMethod("MakeRequest"); 
makeRequestMethod.Invoke(oLateBound, new object[] { innerargs }); 

你不正確的代碼編譯,因爲數組協方差爲埃裏克利珀在他的回答中指出。

4

您只需將字符串參數放入一個object -array。

new Object[] { new String[] { "Mytext" } } 

爲什麼你需要做的,這是一點,InvokeMember需要object - 陣列作爲參數,所以你的字符串數組轉換成對象數組,每個字符串是威脅作爲單個參數的原因。

1

您的innerargs值是錯誤的。

在innerargs陣列中的每個對象表示一個參數

所以你真的應該讓

string[] innerargs = {"Dummy Args"}; 

object[] arg = {innerargs]; 

result = tConnector.InvokeMember("MakeRequest", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, oLateBound, arg); 

或者諸如此類。

1

,args參數是一個數組參數傳遞給成員,因此,如果您的會員的說法是,你需要將它包裝在另一個數組的數組,否則它假定你只是發送一個字符串參數:

result = tConnector.InvokeMember("MakeRequest", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, oLateBound, new object[] { innerargs }); 
6

C#支持數組元素類型協方差對於元素類型爲引用類型的數組。也就是說,您可以自動將string[]轉換爲object[]

所以這裏發生的一切是你逝去的字符串數組,而運行時說:「啊,有對象,我期待的是陣」,現在每個字符串被傳遞作爲參數,而比傳遞作爲參數的字符串數組

訣竅是使物體的陣列包含字符串數組,而不是一個是相同字符串的數組。

相關問題