2 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果你確實(shí)需要這種功能,你可以這樣做。
public delegate object GenericCommand (params object[] parameters);
然后,您需要為您想要存儲(chǔ)的每個(gè)符合 GenericCommand 定義的方法提供重載。
下面是一個(gè)示例。
using System;
using System.Collections.Generic;
public class Program
{
public delegate object GenericCommand (params object[] parameters);
public static object Function1 (params object[] parameters) => Function1 ((int)parameters[0], (int)parameters[1]);
public static int Function1 (int i, int j) => (i + j);
private static Dictionary<string, GenericCommand> commands;
public static void Main()
{
commands = new Dictionary<string, GenericCommand> ();
commands.Add ("Function1", Function1);
int i = (int)commands["Function1"](1, 2);
Console.WriteLine (i); // 3
}
}
綜上所述,在 C# 這樣的語言中執(zhí)行此操作有點(diǎn)棘手,這是有原因的。在強(qiáng)類型語言中,期望是當(dāng)調(diào)用方法時(shí),用戶心中有一組特定的輸入,并期望得到特定類型的輸出。通常不需要像這樣不倫不類的東西,GenericCommand因?yàn)槿绻婪椒ǖ拿Q以及它通常所在的位置,為什么不直接調(diào)用它呢?
如果您發(fā)現(xiàn)自己的程序中經(jīng)常需要這種功能,那么我會(huì)考慮用另一種語言編寫基線的這一部分。我對(duì)此的了解有限,但我相信F#可以輕松完成您所要求的任務(wù)。Javascript 是另一種選擇,但 F# 是作為 C# 的姊妹函數(shù)語言編寫的,因此它可能更容易集成到您的項(xiàng)目中。函數(shù)式語言(據(jù)我所知)更關(guān)心您所編寫內(nèi)容的純粹功能,而不是操作數(shù)的性質(zhì),盡管我不太確定它對(duì)參數(shù)的數(shù)量是否不可知。這當(dāng)然值得研究。

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊
除了編譯為Expression
s 時(shí)之外,lambda 都會(huì)編譯為 的實(shí)例System.Delegate
。但這是一種非常模糊的類型,您必須使用反射來發(fā)現(xiàn)任何東西。
Action
您可以通過聲明一組接受、Action<T>
、等的重載來做得更好。Action<T1, T2>
這些是返回 的函數(shù)的 BCL 內(nèi)置委托類型void
。
- 2 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報(bào)