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

时间:2013-05-13 04:07:27

标签: c# .net oop

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

[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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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)
    {
        //
    }
}

答案 2 :(得分:2)

AppDeveloper说了什么,但使用

代替那些怪异的代码
bool hasAttribute = Attribute.IsDefined(GetType(), typeof(MyAttribute));

答案 3 :(得分:1)

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