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