我有一个基类,我希望所有派生类都将属性放在类的顶部,如下所示:
[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
}
}
如何强制派生类需要该属性,然后在基础构造函数中使用属性值?
答案 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#中使用属性。您可以使用反射在运行时检查属性的存在,但如果有人正确捕获异常,则可以解决这个问题。