簡體   English   中英

通過反射調用“ToString”方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM