如何从基类中要求自定义属性

本文关键字:自定义属性 基类 | 更新日期: 2023-09-27 18:13:26

我有一个基类,我希望所有的派生类都在这个类的上面放一个属性,像这样:

[MyAttribute("Abc 123")]
public class SomeClass : MyBaseClass
{
  public SomeClass() : base()
  {
  }
}

public class MyBaseClass
{
  public string PropA { get; set; }
  public MyBaseClass()
  {
    this.PropA = //ATTRIBUTE VALUE OF DERIVED
  }
}

我如何强制派生类需要属性,然后在基构造函数中使用属性值?

如何从基类中要求自定义属性

也许不使用自定义属性,而是使用带有抽象属性的抽象类。使用此方法可确保每个非抽象派生类都将实现此属性。简单的例子是在MSDN

如果没有找到某个属性,可以在构造函数中抛出异常。

示例:

static void Main(string[] args)
{
    MyClass obj =new MyClass();
}
public class MyClassBase
{
    public MyClassBase()
    {
        bool hasAttribute = this.GetType().GetCustomAttributes(typeof(MyAttribute), false).Any(attr => attr != null);
        // as per 'leppie' suggestion you can also check for attribute in better way
        // bool hasAttribute = Attribute.IsDefined(GetType(), typeof(MyAttribute));
        if (!hasAttribute)
        {
            throw new AttributeNotApplied("MyClass");
        }
    }
}
[MyAttribute("Hello")]
class MyClass : MyClassBase
{
    public MyClass()
    {
    }
}
internal class AttributeNotApplied : Exception
{
    public AttributeNotApplied(string message) : base(message)
    {
    }
}
internal class MyAttribute : Attribute
{
    public MyAttribute(string msg)
    {
        //
    }
}

AppDeveloper说的,但是不要用那堆乱七八糟的代码,用

bool hasAttribute = Attribute.IsDefined(GetType(), typeof(MyAttribute));

据我所知,在c#中没有办法在编译时强制使用属性。您可以在运行时使用反射检查属性的存在,但如果有人正确捕获异常,则可以解决这个问题。