[英]Invoke “ToString” method by reflection
我正在嘗試按如下方式檢索 MethodInfo“ToString”:
MethodInfo method = MyType.GetMethod("ToString",
BindingFlags.Public | BindingFlags.Instance);
拋出異常“找到歧義匹配”。
您的類型包含多個ToString()
重載,而GetMethod
不知道您想要哪一個。
使用以下語法指定您想要不帶任何參數的重載:
MethodInfo method = myType.GetMethod("ToString", Type.EmptyTypes);
注意:由於ToString()
是在System.Object
上定義的,你不需要反射來在未知類型的對象上調用它:
object myObject = ...;
string s = myObject.ToString(); // works
ToString()
是System.Object
的成員,因此它是極少數不需要反射的方法之一,當您在未知類型上調用它時。
例外情況是 Tostring 的重載(即int.ToString(string format)
但要調用其中之一,您必須知道您要查找的是哪一個。
而這些重疊會導致您看到的錯誤。 你必須是具體的。
可能有不止一種ToString()
方法。 例如double
有四個變體( virtual object.ToString()
的覆蓋加上三個變體)
嘗試
var variants = MyType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.Name == "ToString");
它將返回ToString
所有變體
或者,如果您知道“您的” ToString
的參數
var toString = MyType.GetMethod("ToString",
BindingFlags.Public | BindingFlags.Instance,
null, arrayOfParametersType, null);
您需要指定您想要沒有參數的那個:
var method = MyType.GetMethod("ToString",
new Type[0]);
BindingFlags.Public | BindingFlags.Instance
BindingFlags.Public | BindingFlags.Instance
為默認值,無需指定。
MethodInfo method = typeof(MyType).GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance);
這實際上對我有用...
您可能在 ToString 上有一個重載。 由於您可以擁有多個公開的 ToString 方法(重載),因此該行可以返回多個 ToString 方法。
你必須使用類似的東西:
GetMethod(字符串名稱,類型 [] 類型)
其中 Type[] 包含您正在搜索的方法的類型數組(在您的情況下沒有)
(感謝評論,也從中學到了一些東西:)
ToString
可以重載。 在許多類型上都是如此。
首先,您應該檢查您要調用的ToString
是被覆蓋的IFormattable.ToString(string format, IFormatProvider formatProvider))
object.ToString()
還是IFormattable.ToString(string format, IFormatProvider formatProvider))
,因為在這些情況下您可以簡單地避免反射。
您可以使用采用Type[] types
參數的GetMethod
重載來選擇所需的ToString
重載。
例如,您可以使用GetMethod("ToString",new Type[]{})
來獲取無參數的ToString()
。
檢查是否要覆蓋ToString()
是否真的使用了override
關鍵字:
class MyType
{
public override string ToString()
{
return "Whatever";
}
}
否則,您將隱藏 object.ToString() 版本而不是真正覆蓋。
在這樣的場景中,當您知道該方法存在時(可能有許多重載使問題復雜化),使用為您完成繁重工作的反射幫助程序庫會很有幫助。
例如,Fasterflect 允許您簡單地執行以下操作,以便使用給定提供的參數的“最佳可用匹配”調用方法(在下面的示例中,可選參數 42 表示您在調用方法時要使用的某個值):
var obj = ...
var result = obj.TryCallMethodWithValues( "ToString", 42 );
根據我的經驗,使用經過良好測試的庫而不是手動編碼(在本例中為反射)會很快得到回報。
免責聲明:我是 Fasterflect 項目的貢獻者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.