3

我正在尝试创建一个值集合,每个值对应于一个动作。这样,我将能够在集合中搜索特定值,然后以通用方式调用关联的操作。

所以,这是我的第一次尝试:

public class CommandInfo
{
    public string Name { get; set; }
    public Action<RunArgument> Action { get; set; }
}

public class MyClass
{
    public List<CommandInfo> Commands = new List<CommandInfo>
    {
        new CommandInfo { Name = "abc", Action = AbcAction } // <== ERROR HERE
    };

    public void AbcAction(RunArgument arg)
    {
        ; // Do something useful here
    }
}

CommandInfo在这种情况下,Commands集合中 new 的声明给了我错误:

字段初始值设定项不能引用非静态字段、方法或属性“MyNameSpace.MyClass.AbcAction(MyNameSpace.RunArgument)”

当然,必须有一种方法来存储对像这样的非静态方法的引用。有人可以帮我吗?

4

2 回答 2

6

当然,必须有一种方法来存储对像这样的非静态方法的引用。有人可以帮我吗?

有,只是不在字段初始化程序中。所以这很好用:

public List<CommandInfo> Commands = new List<CommandInfo>();

public MyClass()
{
    Commands.Add(new CommandInfo { Name = "abc",
                                   Action = AbcAction });
}

...或在构造函数中执行整个赋值。请注意,这实际上与代表没有任何关系 - 这是偶然的,基于您实际上指的是this.AbcAction. 在其他所有方面,它都相当于这个问题:

public class Foo
{
    int x = 10;
    int y = this.x; // This has the same problem...
}

(我希望你没有真正的公共领域,当然......)

于 2012-10-09T21:11:46.193 回答
5

问题不在于您不能存储对非静态成员的引用,而在于您不能在字段初始值设定项中引用非静态成员。字段初始值设定项只能引用静态或常量值。将初始化移动Commands到构造函数,它将起作用。

public class CommandInfo
{
    public string Name { get; set; }
    public Action<RunArgument> Action { get; set; }
}

public class MyClass
{
    public List<CommandInfo> Commands;

    public MyClass 
    {
        Commands = new List<CommandInfo>
        {
            new CommandInfo { Name = "abc", Action = AbcAction }
        };
    }

    public void AbcAction(RunArgument arg)
    {
        ; // Do something useful here
    }
}
于 2012-10-09T21:11:20.380 回答