问题描述
我想创建一个将值映射到委托的静态 Dictionary
。使用 Add
时效果很好:
class MyClass {
private delegate void _processstatement(Statement statement);
private static Dictionary<Statement.Types,_processstatement> _statementProcessors =
new Dictionary<Statement.Types,_processstatement>();
public MyClass() {
_statementProcessors.Add(Statement.Types.Increment,Increment);
}
private void Increment(Statement s) {}
}
但是,我想在实例化时初始化它们,如下所示:
class MyClass {
private delegate void _processstatement(Statement statement);
private static Dictionary<Statement.Types,_processstatement>() {
{ Statement.Types.Increment,Increment }
}
}
private void Increment(Statement s) {}
}
这给了我错误
集合初始值设定项的最佳重载 Add 方法 'Dictionary
我不完全明白。
有没有可能,我正在努力实现什么?还是我必须在构造函数中初始化它?
已添加具有相同密钥的项目。键:增量
解决方法
看看这段代码:
class MyClass {
private delegate void _processStatement(Statement statement);
private static Dictionary<Statement.Types,_processStatement> _statementProcessors =
new Dictionary<Statement.Types,_processStatement>() {
{ Statement.Types.Increment,Increment }
}
}
private void Increment(Statement s) {}
}
您希望将 Dictionary 设为静态,但 Increment
是 MyClass
的实例方法。想一想——这将如何运作?为了调用 Increment
,需要实例化 MyClass
,但您希望在它发生之前访问它。
你的第一个例子是正确的...
或者,您可以将 Increment
设为静态:
class MyClass {
private delegate void _processStatement(Statement statement);
private static Dictionary<Statement.Types,Increment }
}
}
private static void Increment(Statement s) {}
}
或者,您可以实例化 MyClass
并引用该方法:
class MyClass
{
private delegate void _processStatement(Statement statement);
private static Dictionary<Statement.Types,_processStatement> _statementProcessors;
static MyClass()
{
var myClass = new MyClass();
_statementProcessors = new Dictionary<Statement.Types,_processStatement>
{
{ Statement.Types.Increment,myClass.Increment }
};
}
private void Increment(Statement s) { }
}
或者,您可以创建一个 MyClass
的静态实例:
class MyClass
{
private delegate void _processStatement(Statement statement);
private static MyClass Instance { get; } = new MyClass();
private static Dictionary<Statement.Types,_processStatement> _statementProcessors = new Dictionary<Statement.Types,_processStatement>
{
{ Statement.Types.Increment,Instance.Increment }
};
private void Increment(Statement s) { }
}