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 接口。您可以将您的类实例插入 的位置,?并且implemented可能是myMethod.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

您提出?问题的地方不应该是IDataReader,而是myClass. 您正在传入要调用的对象myMethod

调用的结果.Invoke()将是一个IDataReader,但这不是您正在创建的东西;它是在您正在调用的方法中创建的。

于 2013-09-23T18:57:51.007 回答
0

您不能返回接口类型实例。但您可以显式转换为接口类型并解决此问题。

((myMethod.Invoke . . . ) as InterfaceType) 
于 2013-09-23T19:08:09.157 回答
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 回答