簡體   English   中英

C#如何調用參數數量未知的方法

[英]C# How to call a method with unknown number of parameters

我在這里達到了我的技能極限。 我甚至不知道這是否可行 - 但我希望是這樣。

我正在制作一個命令處理程序(文本)。 對於每個Add()您可以指定所需參數的數量及其類型。 例如:

void Add(string commandName, int requiredParameters, params Type[] paramTypes) { }
Add("test", 2, typeof(string), typeof(int));

所以一個示例命令是: /test hello 7 命令處理程序檢查以確保類型是正確的,例如,如果第二個參數不能轉換為int,它將失敗。

現在我遇到的問題是我想在Add()傳遞一個方法。 (如果所有檢查都通過,命令處理程序將調用此方法,並使用所需參數調用它)。 因此,根據Add()傳遞的內容,所討論的方法可以包含任意數量的參數。

我該如何實現這一目標? 代表不起作用抱怨參數不匹配。 我嘗試過這樣的事情:

void Add<T1, T2>(..., Action<T1, T2> method) { }
Add(..., new Action<string, int>(cmd_MyMethod));

但我必須為很多類型創建一個Add()方法。 例如, Add<T1, T2, T3, T4, etc> ,這也很難輸入對Add()的調用。

不想作為一個字符串傳遞給調用該方法,然后使用this.GetType().GetMethod()來獲得它的句柄。 雖然這種方式是理想的,但是當我進行模糊處理時它會變得混亂。

有誰知道有任何方法可以做到這一點? 提前致謝。

試試這個:

void Add(string commandName, int requiredParameters, Delegate method) { }

您可以調用method.DynamicInvoke(...)來調用委托引用的方法。 請注意,這將使用反射,因此它不會很快。 但它很靈活。

請注意,您仍然需要使用特定類型構造委托,因此您最終可能會這樣調用它:

Add("test", 2, new Action<string, int>(cmd_MyMethod));

請注意,我省略了Type[]參數,因為您實際上可以從委托引用的MethodInfo提取它!
method.Method.GetParameters().Select(p => p.ParameterType).ToArray()

Action<string, int, Type[]>與您的Add方法匹配。

例:

public class ParamsTest
{
    public void CallMyMethod()
    {
        Action<string, int[]> myDelegate = new Action<string, int[]>(MyMethod);
        myDelegate("hello", new int[] { 1, 2, 3, 4 });
    }

    private void MyMethod(string arg1, params int[] theRest)
    {
        Console.WriteLine(arg1);
        foreach (int i in theRest)
        {
            Console.WriteLine(i);
        }
        Console.WriteLine("end");
    }
}

您可以創建自己的自定義屬性,您可以使用該屬性進行標記,然后識別(現在混淆)方法,並使用反射根據屬性查找它們。 然后,您可以使用MethodInfo中的Invoke()來實際調用該方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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