C# 确保在派生类中定义静态属性

C# 确保在派生类中定义静态属性,c#,static,C#,Static,我有一个要求,每个类都必须有一个静态只读属性,以避免使用神奇字符串。最初,我考虑创建一个基类,强制每个派生类实现静态只读属性。因为接口或抽象属性不能用于此。有没有办法在C#中实现这一点? 目前,我的脑海中有以下解决方法,但我很容易看到它会在未来造成混乱,即 基类 派生类 您的问题是没有强制您实现它的约束,因此在基类中定义它似乎是多余的 不幸的是,这些替代方案同样有问题,并且有相同的问题,即您必须为每个派生类创建一个新的分支 public abstract class Derived : Base

我有一个要求,每个类都必须有一个静态只读属性,以避免使用神奇字符串。最初,我考虑创建一个基类,强制每个派生类实现静态只读属性。因为接口或抽象属性不能用于此。有没有办法在C#中实现这一点? 目前,我的脑海中有以下解决方法,但我很容易看到它会在未来造成混乱,即

基类 派生类
您的问题是没有强制您实现它的约束,因此在基类中定义它似乎是多余的

不幸的是,这些替代方案同样有问题,并且有相同的问题,即您必须为每个派生类创建一个新的分支

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)
    {
    }
}