gpt4 book ai didi

C# 在字典中存储函数

转载 作者:IT王子 更新时间:2023-10-29 03:37:53 25 4
gpt4 key购买 nike

如何创建可以存储函数的字典?

谢谢。

我有大约 30 多个可以由用户执行的函数。我希望能够以这种方式执行函数:

   private void functionName(arg1, arg2, arg3)
{
// code
}

dictionaryName.add("doSomething", functionName);

private void interceptCommand(string command)
{
foreach ( var cmd in dictionaryName )
{
if ( cmd.Key.Equals(command) )
{
cmd.Value.Invoke();
}
}
}

然而,函数签名并不总是相同的,因此具有不同数量的参数。

最佳答案

像这样:

Dictionary<int, Func<string, bool>>

这允许您存储采用字符串参数并返回 bool 值的函数。

dico[5] = foo => foo == "Bar";

或者如果函数不是匿名的:

dico[5] = Foo;

Foo 的定义如下:

public bool Foo(string bar)
{
...
}

更新:

看到您的更新后,您似乎事先并不知道要调用的函数的签名。在 .NET 中,为了调用一个函数,您需要传递所有参数,如果您不知道参数是什么,实现这一点的唯一方法是通过反射。

还有另一种选择:

class Program
{
static void Main()
{
// store
var dico = new Dictionary<int, Delegate>();
dico[1] = new Func<int, int, int>(Func1);
dico[2] = new Func<int, int, int, int>(Func2);

// and later invoke
var res = dico[1].DynamicInvoke(1, 2);
Console.WriteLine(res);
var res2 = dico[2].DynamicInvoke(1, 2, 3);
Console.WriteLine(res2);
}

public static int Func1(int arg1, int arg2)
{
return arg1 + arg2;
}

public static int Func2(int arg1, int arg2, int arg3)
{
return arg1 + arg2 + arg3;
}
}

使用这种方法,您仍然需要知道需要传递给字典相应索引处的每个函数的参数的数量和类型,否则您将遇到运行时错误。如果您的函数没有返回值,请使用 System.Action<>而不是 System.Func<> .

关于C# 在字典中存储函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com