2008-10-21 90 views
55

有沒有一種方法可以在.NET(2.0)中使用反射調用重載方法。我有一個應用程序動態實例化已從一個公共基類派生的類。出於兼容的目的,這個基類包含兩個同名的方法,一個帶有參數,另一個沒有。我需要通過Invoke方法調用無參數方法。現在,我得到的只是一個錯誤,告訴我我試圖調用一個模糊的方法。如何使用反射來調用.NET中的重載方法

是的,我可能只是將對象作爲我的基類的一個實例,並調用我需要的方法。最終會發生,但現在,內部複雜化將不會允許它。

任何幫助將是偉大的!謝謝。

回答

89

你必須指定要哪一種方法:

class SomeType 
{ 
    void Foo(int size, string bar) { } 
    void Foo() { } 
} 

SomeType obj = new SomeType(); 
// call with int and string arguments 
obj.GetType() 
    .GetMethod("Foo", new Type[] { typeof(int), typeof(string) }) 
    .Invoke(obj, new object[] { 42, "Hello" }); 
// call without arguments 
obj.GetType() 
    .GetMethod("Foo", new Type[0]) 
    .Invoke(obj, new object[0]); 
14

是的。當您調用該方法時,請傳遞與您想要的重載匹配的參數。

例如:

Type tp = myInstance.GetType(); 

//call parameter-free overload 
tp.InvokeMember("methodName", BindingFlags.InvokeMethod, 
    Type.DefaultBinder, myInstance, new object[0]); 

//call parameter-ed overload 
tp.InvokeMember("methodName", BindingFlags.InvokeMethod, 
    Type.DefaultBinder, myInstance, new { param1, param2 }); 

如果你這樣做的另一種方式圓(通過查找的MemberInfo並調用調用IE)要小心,你會得到正確的 - 無參數超載可能是第一個找到。

+0

有趣的是,這並不工作。我沒有傳入任何參數給我的無參數方法,而且我仍然有一個模糊的調用。 – 2008-10-21 21:08:34

+0

這是如何與不同類型的參數一起工作的?假設我有兩個重載,一個接受一個字符串,另一個接受一個int? – smaclell 2008-10-21 21:10:51

+0

沒有問題 - 參數的基礎類型是檢查的內容。 – Keith 2008-10-21 21:11:48

5

使用帶有System.Type []的GetMethod重載,並傳遞一個空的Type [];

typeof (Class).GetMethod ("Method", new Type [ 0 ] { }).Invoke (instance, null);