我正在尝试设计一个工厂类,让我的团队成员可以轻松添加新的"操作",我希望类的属性是不可变的但是出于调试目的,我代表们需要能够引用包含类的属性。
考虑以下课程:
public class NamedAction
{
public NamedAction(string name, Action action)
{
// Here there is some additional validation,
// such as null parameter checking, etc.
Name = name;
Action = action;
}
public string Name { get; private set; }
public Action Action { get; private set; }
public override string ToString()
{
return "Action: " + Name;
}
}
在工厂类中,我有以下方法来创建特殊命名操作的实例:
private static NamedAction GetSpecialAction()
{
NamedAction na = null;
na = new NamedAction(
"SpecialAction",
() => {
Console.WriteLine("My name is " + na.Name + " and I am special");
Console.WriteLine("Hi, its " + na.Name + " again. I like kittens.");
}
);
return na;
}
我遇到的问题是ReSharper告诉第二个Console.WriteLine正在访问修改后的闭包。我猜它是因为捕获的变量实际上仍然是" null"当在委托的构造中捕获它的引用时,因为它是构造函数的参数。
为了强制执行正确的用法,我想保证Action不是null并且是不可变的,到目前为止,我还没有找到任何方法在没有构造函数的情况下执行它。我想过使用构建器模式,但我不知道如何提供访问" self" (这)在分配的行动中,我担心告诉我的团队忽略修改后的关闭警告。
我知道人们可以创建蓝图/对象,然后将其发送到构建器/汇编程序类,返回具体对象,但这并不能解决我在编译时保证非空的问题。 / p>
在放弃之前我希望我的问题有一些优雅的解决方案......