リフレクションによって "ToString"メソッドを呼び出す

私は次のようにMethodInfo "ToString"を取得しようとしています:

MethodInfo method = MyType.GetMethod("ToString", 
                                     BindingFlags.Public | BindingFlags.Instance);

例外がスローされました。 "あいまい一致が見つかりました"。

0
とにかく MyType とは何ですか?その型は ToString()のオーバーロードを持っているかもしれませんが、常にパラメータのないものがあります。
追加された 著者 BoltClock,
ToString を単に呼び出すことはできません。すべてのオブジェクトが1つを持っているのを見て...
追加された 著者 Oded,
@AdamHouldsworth - おそらく、OPには言及されていませんが、何か別の方法です。
追加された 著者 Oded,
@Odedは別の署名で取得しようとしている可能性がありますか?
追加された 著者 Adam Houldsworth,

8 答え

あなたのタイプに複数の ToString()オーバーロードが含まれていて、 GetMethod で目的のタイプがわからない。

パラメータを使用しないオーバーロードを指定するには、次の構文を使用します。

MethodInfo method = myType.GetMethod("ToString", Type.EmptyTypes); 

注意: ToString()System.Object で定義されているので、未知の型のオブジェクトでそれを呼び出すためにリフレクションは必要ありません。

object myObject = ...;
string s = myObject.ToString();//works
6
追加された

ToString() is a member of System.Object and thus it is one of the very few methods that you don't need reflection for when you wat to call it on an unknown Type.

例外はTostringのオーバーロード(つまり )ですが、探しているものを知る必要があります。

そしてそれらのオーバーロードはあなたが見るエラーを引き起こします。あなたは具体的にする必要があります。

3
追加された

引数のないものを指定する必要があります。

var method = MyType.GetMethod("ToString", 
                              new Type[0]);

BindingFlags.Public | BindingFlags.Instance is the default values, no need to specify them.

1
追加された

おそらく複数の ToString()メソッドがあります。例えば double には4つのバリエーションがあります( virtual object.ToString()と3つのバリエーションのオーバーライド)

試す

var variants = MyType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
               .Where(p => p.Name == "ToString");

it will return all the variants of ToString

or, if you know the parameters of "your" ToString

var toString = MyType.GetMethod("ToString", 
               BindingFlags.Public | BindingFlags.Instance, 
               null, arrayOfParametersType, null);
1
追加された

実際に override キーワードを使用する ToString()をオーバーライドするかどうかを確認します。

class MyType
{
     public override string ToString()
     {
         return "Whatever";
     }
 }

それ以外の場合は、実際にオーバーライドするのではなく、Object.ToString()のバージョンを隠しています。

0
追加された

このようなシナリオでは、メソッドが存在することがわかっている場合(問題を複雑にするオーバーロードの可能性があります)、 Reflectionヘルパーライブラリを参照してください。

たとえば、Fasterflectでは、指定されたパラメータが指定されている場合、「最も利用可能な一致」を使用してメソッドを呼び出すために、次の操作を行うことができます(下の例では、オプションの引数42は、 ):

var obj = ...
var result = obj.TryCallMethodWithValues( "ToString", 42 );

私の経験では、ハンドコーディング(この場合はリフレクション)の代わりに十分にテストされたライブラリを使用すると、かなり早い段階で結果が得られます。

免責事項:私はFasterflectプロジェクトに貢献しています。

0
追加された

ToString can be overloaded. And on many types it is.

まず、呼び出す ToString がオーバーライドされた object.ToString()

ToString のオーバーロードを選択するために Type [] types パラメータを使用する GetMethod のオーバーロードを使用できます。

たとえば、

GetMethod( "ToString"、新しいタイプ[] { }) を使用して、パラメータなしの ToString()を取得します。

0
追加された
MethodInfo method = typeof(MyType).GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance);

それは実際に私のために働く...

ToStringにはおそらくオーバーロードがあります。 公開されている複数のToStringメソッド(オーバーロード)を持つことができるので、この行は複数のToStringメソッドを返す可能性があります。

次のようなものを使用する必要があります:
    GetMethod(文字列名、型[]型)

Type []に​​は、タイプの配列が含まれています。検索するメソッドには(あなたの場合はありません)

(コメントありがとう、またこれから何かを学んだ:)

0
追加された
過負荷がない場合にのみ動作します...
追加された 著者 jgauffin,
それは自分のコード上でいいです。その検索パラメータ内に "ToString"と呼ばれるメソッドが複数見つかった場合、失敗します。インスタンス。
追加された 著者 Adam Houldsworth,