1

我有一个基类,我希望所有派生类都在类的顶部放置一个属性,如下所示:

[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
  }
}

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

4

4 回答 4

5

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

于 2013-05-13T04:23:05.057 回答
3

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

样本 :

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)
    {
        //
    }
}
于 2013-05-13T04:27:58.293 回答
2

What AppDeveloper said, but instead of that monstrosity of code, use

bool hasAttribute = Attribute.IsDefined(GetType(), typeof(MyAttribute));
于 2013-05-13T04:50:25.617 回答
1

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

于 2013-05-13T04:12:18.523 回答