C# 确保在派生类中定义静态属性
我有一个要求,每个类都必须有一个静态只读属性,以避免使用神奇字符串。最初,我考虑创建一个基类,强制每个派生类实现静态只读属性。因为接口或抽象属性不能用于此。有没有办法在C#中实现这一点? 目前,我的脑海中有以下解决方法,但我很容易看到它会在未来造成混乱,即 基类 派生类C# 确保在派生类中定义静态属性,c#,static,C#,Static,我有一个要求,每个类都必须有一个静态只读属性,以避免使用神奇字符串。最初,我考虑创建一个基类,强制每个派生类实现静态只读属性。因为接口或抽象属性不能用于此。有没有办法在C#中实现这一点? 目前,我的脑海中有以下解决方法,但我很容易看到它会在未来造成混乱,即 基类 派生类 您的问题是没有强制您实现它的约束,因此在基类中定义它似乎是多余的 不幸的是,这些替代方案同样有问题,并且有相同的问题,即您必须为每个派生类创建一个新的分支 public abstract class Derived : Base
您的问题是没有强制您实现它的约束,因此在基类中定义它似乎是多余的 不幸的是,这些替代方案同样有问题,并且有相同的问题,即您必须为每个派生类创建一个新的分支
public abstract class Derived : Base
{
}
public static class Helper<T> where T : Base
{
public static string SomeProperty => GetMyProperty();
public static string GetMyProperty()
{
if (typeof(T) == typeof(Derived))
{
return "asd";
}
throw new ArgumentOutOfRangeException();
}
}
您的问题是没有强制您实现它的约束,因此在基类中定义它似乎是多余的 不幸的是,这些替代方案同样有问题,并且有相同的问题,即您必须为每个派生类创建一个新的分支
public abstract class Derived : Base
{
}
public static class Helper<T> where T : Base
{
public static string SomeProperty => GetMyProperty();
public static string GetMyProperty()
{
if (typeof(T) == typeof(Derived))
{
return "asd";
}
throw new ArgumentOutOfRangeException();
}
}
我不完全确定我是否理解你的问题,但我认为解决办法相当简单。你真的需要一个静态属性吗??如果没有,只需添加一个带有参数的私有构造函数来初始化属性:
public abstract class Base
{
public string StaticProperty { get; }
protected Base(string staticProperty)
{
StaticProperty = staticProperty ?? throw new ArgumentNullException(nameof(staticProperty));
}
}
然后,在派生类中,调用基构造函数(否则会出现编译错误):
如您所见,如果不调用基本构造函数,将出现编译错误:
public class Derived : Base
{
public Derived(string staticProperty) : base(staticProperty)
{
}
}
我不能完全确定我是否理解您的问题,但我认为解决方法非常简单。你真的需要一个静态属性吗??如果没有,只需添加一个带有参数的私有构造函数来初始化属性:
public abstract class Base
{
public string StaticProperty { get; }
protected Base(string staticProperty)
{
StaticProperty = staticProperty ?? throw new ArgumentNullException(nameof(staticProperty));
}
}
然后,在派生类中,调用基构造函数(否则会出现编译错误):
如您所见,如果不调用基本构造函数,将出现编译错误:
public class Derived : Base
{
public Derived(string staticProperty) : base(staticProperty)
{
}
}
你说:
一个具体的例子是,任何派生类都必须将表名作为静态字符串,以避免使用魔术字符串
因此,您希望确保这样的属性存在,可能是因为您希望使用反射来访问它。编写一个单元测试,对所有此类类型进行反射,并使用反射确保它们包含静态属性
C型系统在这方面帮不了你。写一个单元测试来断言这个结构。你说:
一个具体的例子是,任何派生类都必须将表名作为静态字符串,以避免使用魔术字符串
因此,您希望确保这样的属性存在,可能是因为您希望使用反射来访问它。编写一个单元测试,对所有此类类型进行反射,并使用反射确保它们包含静态属性
C型系统在这方面帮不了你。编写一个单元测试来断言此结构。您的要求是什么?你能给我们一个具体的例子说明你的代码应该如何使用吗?@RuiJarimba一个具体的例子可以是任何派生类都必须将表名作为静态字符串,以避免出现神奇的字符串。这感觉像是XY问题-。为什么派生类型需要专门定义静态属性?@ZerosAndOnes不确定我是否理解您的问题,但请检查我的答案。您的要求是什么?你能给我们一个具体的例子说明你的代码应该如何使用吗?@RuiJarimba一个具体的例子可以是任何派生类都必须将表名作为静态字符串,以避免出现神奇的字符串。这感觉像是XY问题-。为什么派生类型需要专门定义静态属性?@ZerosAndOnes不确定我是否理解您的问题,但请检查我的答案。谢谢,这让我找到了正确的方向,因为静态属性也可以在构造函数中访问。谢谢,这使我朝着正确的方向前进,因为静态属性也可以在构造函数中访问。
public class Derived : Base
{
public Derived(string staticProperty) : base(staticProperty)
{
}
}