[英]How to call generic method by reflection using InvokeMember
我需要通過反射調用一個方法。 但問題是我不想找到一種方法,我想在運行時使用 arguments 對其進行評估。 這就是我嘗試做的事情:
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
class 中找不到具有此簽名的任何方法。
您可以將T2
移動到 class 定義,如下所示: 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
調用泛型方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.