如何使用InvokeMember通过反射调用泛型方法



我需要通过反射调用一个方法。但问题是,我不想找到一个方法,我想在运行时使用参数来评估它。这就是我尝试做的:

class Program
{
static void Main(string[] args)
{
var type = typeof(Test<int>);
type.InvokeMember("Write", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
null, new Test<int>(), new object[] {1, "1"});
// The next call fails
type.InvokeMember("Write", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
null, new Test<int>(), new object[] { 2, 2 });
}
}
public class Test<T>
{
public void Write(T arg1, string arg2)
{
Console.Write(arg1);
Console.Write(arg2);
Console.WriteLine(" write1");
}
public void Write<T2>(T arg1, T2 arg2)
{
Console.Write(arg1);
Console.Write(arg2);
Console.WriteLine(" write2");
}
}

第一个调用运行良好,但第二个调用生成一个异常,表示找不到Write((。我可以使用InvokeMember调用它吗?我不想试图查找所有方法,然后调用像MakeGenericMethod((这样的方法

您的第二个调用尝试使用两个int输入调用Write方法,但在Test类中找不到任何具有此签名的方法。

您可以将T2移动到类定义中,如下所示:public class Test<T, T2>并在类型声明中设置T2,如下所示:var type = typeof(Test<int,int>)

最终代码:

class Program
{
static void Main(string[] args)
{
var type = typeof(Test<int, long>);
var instance = Activator.CreateInstance(type);
type.InvokeMember("Write", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
null, instance, new object[] { 1, "1" });
type.InvokeMember("Write", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
null, instance, new object[] { 2, 22 });
}
}
public class Test<T, T2>
{
public void Write(T arg1, string arg2)
{
Console.Write(arg1);
Console.Write(arg2);
Console.WriteLine(" write1");
}
public void Write(T arg1, T2 arg2)
{
Console.Write(arg1);
Console.Write(arg2);
Console.WriteLine(" write2");
}
}

这似乎是不可能的。此处文档中的备注部分明确表示

不能使用InvokeMember来调用泛型方法。

最新更新