簡體   English   中英

如何調用返回接口的方法

[英]How to invoke a method which returns an interface

我通過反射調用一個類型的方法,它采用了幾個參數:

var myType = typeof(myClass);

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

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

我希望目標是一個IDataReader,這是該方法將返回的,但我顯然無法實例化一個新的接口實例。

您不能返回接口,但可以返回實現您的方法返回的接口的類實例。 只是施展它。

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

您的類只能實現IDataReader接口。 你可以在你的位置插入你的類實例? implemented可能的結果myMethod.Invoke(yourClassInstance, new object[] { "", "" })

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

返回接口沒有任何內容,但它是您調用的方法的實際對象。 如果你知道這個方法返回實現IDataReader類只是寫

IDataReader rd=myMethod.Invoke(yourInstance, new object[] { "", "" });.

你放在哪里? 在問題中不應該是IDataReader ,而是myClass一個實例。 您正在傳入要調用myMethod的對象。

調用.Invoke()的結果將是一個IDataReader ,但這不是你要創建的東西; 它是在您調用的方法內創建的。

你不能返回接口類型實例。但是你可以顯式地轉換為接口類型並且可以解決這個問題。

((myMethod.Invoke . . . ) as InterfaceType) 

就像你認為的那樣:

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;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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