2010-07-19 99 views
2

我試圖使用Type.InvokeMember(String, BindingFlags, Binder, Object, array [])與默認聯編程序。Type.InvokeMember和參考類型

對象數組中的目標方法的參數之一是引用類型設置爲null。我想要調用的方法實例化引用類型,以便我可以繼續使用它。例如:

using System; 

namespace ConsoleApplication6 
{ 
    class A 
    { 
     public void GetReferenceType(object o) 
     { 
      o = new object(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      object o = null; 
      A a = new A(); 
      Type t = typeof(A); 
      t.InvokeMember("GetReferenceType", System.Reflection.BindingFlags.InvokeMethod, null, a, new object[] { o }); 

      if (o == null) 
      { 
       throw new NullReferenceException(); 
      } 
      else 
      { 
       //do something with o; 
      } 
     } 
    } 
} 

解決方法是給A一個屬性並通過它訪問o。

有沒有另一種方法可以不改變A

回答

7

好吧,你需要在這裏做兩個變化:

  • 讓您GetReferenceType參數ref

    public void GetReferenceType(ref object o) 
    

    要做到這一點,因爲現在你的方法是無操作到外面的世界。你應該閱讀我的article on parameter handling in C#

  • 陣列內使用值InvokeMember後,而不是原來的參考:

    A a = new A(); 
    Type t = typeof(A); 
    object[] args = new object[] { null }; 
    t.InvokeMember("GetReferenceType", BindingFlags.InvokeMethod, 
           null, a, args); 
    object o = args[0]; 
    

當例如創建陣列new object[] { o }只是將的值o複製到數組中 - 它不會將該數組元素與o變量相關聯。

更好的解決方案是使GetReferenceType回報新的價值,但是......這是很少在一個void方法使用outref參數是一個好主意。

+0

我寧可不更改A(或它的方法getReferenceType)。任何其他方式? – 2010-07-19 12:12:21

+0

@Matt:編號'A.GetReferenceType'是一個破碎的方法。這是一個無操作。它沒有任何用處。你真的需要明白這是爲什麼,以避免將來遇到類似的問題。 – 2010-07-19 12:16:07

+0

感謝您的文章,我現在明白了。在閱讀之前,我從來沒有真正看到需要通過引用傳遞引用類型! – 2010-07-19 12:22:20