簡體   English   中英

如何使用 InvokeMember 通過反射調用泛型方法

[英]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.

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