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