【问题标题】:How to invoke a method which returns an interface如何调用返回接口的方法
【发布时间】:2013-09-28 18:53:19
【问题描述】:

我正在通过反射调用一个类型的方法,该方法需要几个参数:

var myType = typeof(myClass);

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

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

我希望目标是 IDataReader,这是该方法将返回的内容,但我显然无法实例化接口的新实例。

【问题讨论】:

  • 只需传递一个对象,然后再进行投射。
  • 通常将返回值投射到你的界面,比如(IYourInterface) myMethod.Invoke...
  • 正如大家所说,你应该创建一个实现接口的对象,然后进行转换。您可能想查看Ninject。依赖注入可能正是您所需要的
  • 为什么不var result = (IDataReader)myMethod.Invoke(new myClass(), new object[] { "", "" });

标签: c# reflection types interface idatareader


【解决方案1】:
myMethod.Invoke(?, new object[] { "", "" });

?与返回接口无关,但它是您正在调用的方法的实际对象。如果你知道这个方法返回的类实现了IDataReader 就写

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

【讨论】:

    【解决方案2】:

    你不能返回接口,但是你可以返回一个实现你方法返回的接口的类的实例。就投吧。

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

    您的类必须只实现 IDataReader 接口。您可以在? 的位置插入您的类实例,而implemented 可能是myMethod.Invoke(yourClassInstance, new object[] { "", "" }) 的结果。

    【讨论】:

      【解决方案3】:

      您在问题中放置? 的位置不应该是IDataReader,而是myClass 的一个实例。您正在传递要在其上调用 myMethod 的对象。

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

      【讨论】:

      • the same instance you used above 不,myType 是一个对象描述类型,它的类型是TypemyClass 是一个类型名称。 typeof 不能与变量名一起使用
      【解决方案4】:

      你不能返回接口类型实例。但是你可以显式地转换成接口类型并且可以解决这个问题。

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

      【讨论】:

        【解决方案5】:

        就像你想的那样:

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

        【讨论】:

          猜你喜欢
          • 2019-12-29
          • 1970-01-01
          • 2019-07-02
          • 2021-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多