4

いくつかのパラメーターを取るリフレクションを介して型のメソッドを呼び出しています。

var myType = typeof(myClass);

var myMethod = myType.GetMethod("myMethodInClass", 
                                 new[] { typeof(string), typeof(string) });

myMethod.Invoke(?, new object[] { "", "" });

ターゲットをメソッドが返す IDataReader にしたいのですが、インターフェイスの新しいインスタンスをインスタンス化できないことは明らかです。

4

5 に答える 5

2

インターフェイスを返すことはできませんが、メソッドが返すインターフェイスを実装するクラスのインスタンスを返すことはできます。キャストするだけです。

IDataReader implemented = new YourClass(); // or any other constructor

クラスは IDataReader インターフェイスのみを実装する必要があります。クラス インスタンスを の代わりに挿入でき、 の結果である可能性があり?ます。implementedmyMethod.Invoke(yourClassInstance, new object[] { "", "" })

于 2013-09-23T18:55:07.500 に答える
2
myMethod.Invoke(?, new object[] { "", "" });

? インターフェイスを返すことは何もありませんが、呼び出しているメソッドの実際のオブジェクトです。このメソッドがIDataReader書き込みだけを実装するクラスを返すことがわかっている場合

IDataReader rd=myMethod.Invoke(yourInstance, new object[] { "", "" });.
于 2013-09-23T19:05:32.120 に答える
1

あなたが質問に入れた場所は、ではなく、のインスタンスである?べきです。呼び出したいオブジェクトを渡しています。IDataReadermyClassmyMethod

呼び出しの結果は.Invoke()になりますがIDataReader、それはあなたが作成しているものではありません。呼び出しているメソッド内で作成されます。

于 2013-09-23T18:57:51.007 に答える
0

あなたが思うように:

class Gadget
{
  public IList<int> FizzBuzz( int length , int startValue )
  {
    if ( length < 0 ) throw new ArgumentOutOfRangeException("length") ;
    int[] list = new int[length];
    for ( int i = 0 ; i < list.Length ; ++i )
    {
      list[i] = startValue++ ;
    }
    return list ;
  }
}
class Program
{
  static void Main( string[] args )
  {
    object     x             = new Gadget() ;
    Type       t             = x.GetType() ;
    MethodInfo mi            = t.GetMethod("FizzBuzz") ;
    object     returnedValue = mi.Invoke( x , new object[]{ 10 , 101 } ) ;
    IList<int> returnedList  = (IList<int>) returnedValue ;
    string     msg           = returnedList.Select( n => n.ToString(CultureInfo.InvariantCulture)).Aggregate( (s,v) => string.Format("{0}...{1}" , s , v) ) ;
    Console.WriteLine(msg) ;
    return;
  }
}
于 2013-09-23T19:14:07.380 に答える
0

インターフェイス型のインスタンスを返すことはできませんが、インターフェイス型に明示的にキャストして、これを解決できます。

((myMethod.Invoke . . . ) as InterfaceType) 
于 2013-09-23T19:08:09.157 に答える