C#使用委托构造不可变对象

时间:2014-08-27 10:51:08

标签: c# delegates closures immutability factory-pattern

我正在尝试设计一个工厂类,让我的团队成员可以轻松添加新的"操作",我希望类的属性是不可变的但是出于调试目的,我代表们需要能够引用包含类的属性。

考虑以下课程:

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>

在放弃之前我希望我的问题有一些优雅的解决方案......

0 个答案:

没有答案