3

我希望能够使用可变数量的参数(有时没有参数,有时有 11 个)对匿名方法进行内联调用。

Dictionary<string, Action> ActionDic = new Dictionary<string, Action>();
int i = 0;
ActionDic["something"] = () => { i += 1; };           // this line is ok
ActionDic["somethingArgs"] = (int n) => { n += 1; };  // but this is not
    // Delegate 'System.Action' does not take 1 arguments

所以我不能让代表接受这样的论点。我的语法是错误的,还是不可能?或者我是否必须更改我应该用于我的字典的匿名方法的类型?

4

4 回答 4

4

Action<int>如果你想用 1 个整数参数定义一个委托,你可以使用。例如:

Action<int> somethingArgs = (int n) => { n += 1; };

您还没有显示ActionDic变量是什么,但如果它是一个,IDictionary<string, Action>您将无法完成这项工作,因为Action不接受参数。

另一方面,您可以做的是使用代表字典:

IDictionary<string, Delegate> ActionDic = ...
ActionDic["something"] = (Action)(() => { i += 1; }); 
ActionDic["somethingArgs"] = (Action<int>)((int n) => { n += 1; });
于 2013-02-04T06:53:26.703 回答
3

你不能。Action并且Action<T>是不同的、不兼容的委托类型。

有几种方法可以弥补这一点。

一种方法是制作ActionDic一个Dictionary<string, Action<int>>,但这可能无法满足您想要使用的所有可能的代表。

另一种方法是制作ActionDic类似 a 的东西,Dictionary<string, Delegate>但这使用起来很麻烦,因为您需要确切知道要传递每个函数的参数数量(及其类型)。这些信息需要存储在另一个数据结构中的某个地方。

第三种方法是创建ActionDic一个Dictionary<string, Action<object[]>>并要求委托从输入中解压缩它需要的任何参数。调用者将负责确切了解要使用的参数。这将允许第二个选项的语法不那么尴尬,但在每个委托中需要更多代码。

于 2013-02-04T06:52:50.717 回答
2

您正在谈论两个不同的代表,即ActionAction<T>。您不能分配Action<T>Action

Action a1 = () => { i += 1; };
Action<int> a2 = (n) => { n += 1; };

我想你有Dictionary<string,Action>,所以这本字典不能接受Action<T>.

作为旁注,我想说第二个委托绝对没用,因为它增加了一个int按值传递的参数,实际上什么也没做。

还可以考虑阅读如何传递可选参数。虽然它与匿名方法无关,但它可能会给你一些关于如何传递可变数量参数的线索

于 2013-02-04T06:54:05.813 回答
0

Action 是一种创建返回 void 且不带参数的委托的捷径。如果你想要带参数的动作,你需要使用通用形式:

Action<int>是一个接受一个 int 参数的委托

Action<string, double>接受 2 个参数:第一个是字符串,第二个是双精度。

于 2013-02-04T06:52:53.390 回答