如何从基类中要求自定义属性
本文关键字:自定义属性 基类 | 更新日期: 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#中没有办法在编译时强制使用属性。您可以在运行时使用反射检查属性的存在,但如果有人正确捕获异常,则可以解决这个问题。