我通过反射调用类型的方法,该方法需要几个参数:
var myType = typeof(myClass);
var myMethod = myType.GetMethod("myMethodInClass",
new[] { typeof(string), typeof(string) });
myMethod.Invoke(?, new object[] { "", "" });
我希望目标是一个IDataReader,这个方法将返回,但我显然无法实例化一个新的接口实例。
答案 0 :(得分:2)
您不能返回接口,但可以返回实现您的方法返回的接口的类实例。只是施展它。
IDataReader implemented = new YourClass(); // or any other constructor
您的类必须只实现IDataReader接口。您可以在?
的位置插入您的班级实例,implemented
可能是myMethod.Invoke(yourClassInstance, new object[] { "", "" })
的结果。
答案 1 :(得分:2)
myMethod.Invoke(?, new object[] { "", "" });
?返回接口没有任何内容,但它是您调用的方法的实际对象。如果您知道此方法返回实现IDataReader
的类,则只需编写
IDataReader rd=myMethod.Invoke(yourInstance, new object[] { "", "" });.
答案 2 :(得分:1)
您在问题中放置?
的位置不应该是IDataReader
,而应该是myClass
的实例。您正在传入要调用myMethod
的对象。
调用.Invoke()
的结果将是IDataReader
,但这不是您要创建的内容;它是在你调用的方法中创建的。
答案 3 :(得分:0)
你不能返回接口类型实例。但是你可以显式地转换为接口类型并且可以解决这个问题。
((myMethod.Invoke . . . ) as InterfaceType)
答案 4 :(得分: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;
}
}