2012-07-18 7 views
21

私は、stringから暗黙的にキャスト可能なクラスThingを持っています。 Thingパラメータを直接呼び出すと、stringからThingへのキャストが正しく行われます。私は同じメソッドを呼び出すためにリフレクションを使用する場合反映されたメソッド呼び出しに暗黙的にキャストする方法

は、しかし、それは

System.ArgumentException : Object of type 'System.String' cannot be 
converted to type 'Things.Program+Thing'. 

はたぶんこれのために良い理由があるが、私はそれを把握することができない例外がスローされます。誰かがリフレクションを使ってこれをどうやって動かすか考えていますか?

namespace Things 
{ 
    class Program 
    { 
     public class Thing 
     { 
      public string Some; 

      public static implicit operator Thing(string s) 
      { 
       return new Thing {Some = s}; 
      } 
     } 

     public void showThing(Thing t) 
     { 
      Console.WriteLine("Some = " + t.Some); 
     } 

     public void Main() 
     { 
      showThing("foo"); 
      MethodInfo showThingReflected = GetType().GetMethod("showThing"); 
      showThingReflected.Invoke(this, new dynamic[] {"foo"}); 
     } 
    } 
} 

メタ:してください、暗黙的キャストや反射が悪い理由がない議論。あなたは配列型による変換を行うことができます。この特定のケースで

+4

暗黙的なキャストがコンパイラの構文砂糖であるため、私の頭の上にはないので、私はそれを賭けるだろう。キャストメソッドへの実際の呼び出しは、コンパイル時に配線されていること。編集:任意のオブジェクトの変換のための暗黙のコンバータを呼び出すいくつかの一般的な方法を持つ必要がありますか?または、これは、別の静的メソッドや、あらかじめ決められたメソッドや特殊なコンストラクタへの他のリフレクションコールをターゲットにしたいという特別なケースですか? –

+0

同様の質問[こちら](http://stackoverflow.com/questions/4501469/c-sharp-implicit-cast-overloading-and-reflection-problem) –

+2

暗黙のキャストはリフレクションでは不可能ですが、[TypeConvertor]を使用することができます( http://msdn.microsoft.com/en-us/library/98bbex99.aspx#the_typeconverter_class)。 –

答えて

1

、それは

showThingReflected.Invoke(this, new Thing[] {"foo"}); 

であるが、それは「不正行為」のようなものです。一般的には、Invokeにはユーザ定義のimplicit operatorを考慮する必要はありません。この変換は、コンパイル時に推測する必要があります。

9

トリックは、コンパイラが暗黙の型変換演算子のop_Implicitと呼ばれる特殊な静的メソッドを作成することを実現することです。

+0

brilliant !!!!!!!!!!!!! – denfromufa

+0

ここで別の同様の答えです:http://stackoverflow.com/a/32025393/2230844 – denfromufa

関連する問題