属性和静态构造函数的设计模式

时间:2016-03-14 13:35:01

标签: c# properties constructor static

我有一个带静态属性的基类和一个静态构造函数。现在,当我创建派生实例时,我希望将这些属性与该实例隔离(非静态)。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

更新了与更新后问题匹配的答案。

要通过实例类访问静态属性,您可以使用以下内容:

class SomeClass
{
    private static string staticFoo;

    public string Foo
    {
        get { return SomeClass.staticFoo; }
    }
}

然而,静态构造函数是不同的。您无法手动调用它们,并且在创建第一个实例或引用静态成员时会自动调用它们。 More info on static constructors on MSDN.

已更新评论:

我认为这是你最接近你想要的。

class SomeClass
{
    private static string staticFoo;

    private string instanceFoo;

    public SomeClass()
    {
        instanceFoo = staticFoo; // Assign the instance variable.
    }

    public static string StaticFoo // Static property.
    {
        get { return staticFoo; }
    }

    public string Foo // Instance property.
    {
        get { return instanceFoo; }
    }
}

答案 1 :(得分:1)

最好的方法是将基类更改为不具有静态属性。如果您希望它们是特定于实例的,请不要将它们设置为静态。

如果无法更改基类,则可以在子类中创建新属性,并将基类的静态属性的值复制到子类构造函数中的非静态属性,然后使用子类属性而不是静态基类属性。

但是,如果你有现有的代码,你不能改变使用基类静态属性,并且你希望以某种方式强制静态属性不再是静态的,那么你就不走运了。

答案 2 :(得分:0)

好的回答我自己的问题。所以我设法解决了这个问题:

public abstract class IntegrationTestBase
{
    private static bool _constructed;

    protected IntegrationTestBase()
    {
        if (_constructed)
        {
            lock (Lock)
            {
                AssignNonStaticProperties();
            }

            return;
        }

        _constructed = true;

        // Do the stuff which was originally in the static constructor, runs only once
        ...
    }
}

这样做我还必须使一堆方法非静态。我也遇到了[ClassInitialize]的一些问题,必须在静态方法上使用。所以我将这些更改为带有_constructed bool的默认构造函数。