有沒有一種方法可以在.NET(2.0)中使用反射調用重載方法。我有一個應用程序動態實例化已從一個公共基類派生的類。出於兼容的目的,這個基類包含兩個同名的方法,一個帶有參數,另一個沒有。我需要通過Invoke方法調用無參數方法。現在,我得到的只是一個錯誤,告訴我我試圖調用一個模糊的方法。如何使用反射來調用.NET中的重載方法
是的,我可能只是將對象作爲我的基類的一個實例,並調用我需要的方法。最終會發生,但現在,內部複雜化將不會允許它。
任何幫助將是偉大的!謝謝。
有沒有一種方法可以在.NET(2.0)中使用反射調用重載方法。我有一個應用程序動態實例化已從一個公共基類派生的類。出於兼容的目的,這個基類包含兩個同名的方法,一個帶有參數,另一個沒有。我需要通過Invoke方法調用無參數方法。現在,我得到的只是一個錯誤,告訴我我試圖調用一個模糊的方法。如何使用反射來調用.NET中的重載方法
是的,我可能只是將對象作爲我的基類的一個實例,並調用我需要的方法。最終會發生,但現在,內部複雜化將不會允許它。
任何幫助將是偉大的!謝謝。
你必須指定要哪一種方法:
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]);
是的。當您調用該方法時,請傳遞與您想要的重載匹配的參數。
例如:
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)要小心,你會得到正確的 - 無參數超載可能是第一個找到。
使用帶有System.Type []的GetMethod重載,並傳遞一個空的Type [];
typeof (Class).GetMethod ("Method", new Type [ 0 ] { }).Invoke (instance, null);
有趣的是,這並不工作。我沒有傳入任何參數給我的無參數方法,而且我仍然有一個模糊的調用。 – 2008-10-21 21:08:34
這是如何與不同類型的參數一起工作的?假設我有兩個重載,一個接受一個字符串,另一個接受一個int? – smaclell 2008-10-21 21:10:51
沒有問題 - 參數的基礎類型是檢查的內容。 – Keith 2008-10-21 21:11:48