Вы должны использовать свойство [AttributeUsage(Inherited = true)]
в своем атрибуте.
[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public sealed class CustomAttribute : Attribute {
public CustomAttribute() {
}
}
Но его значение по умолчанию истинно, и производный класс должен быть доступен для вашего настраиваемого атрибута. Я рекомендую приведенный ниже пример блока для проверки.
Во-первых, определите атрибуты.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method |
AttributeTargets.Property | AttributeTargets.Field)]
public class InheritedAttribute : Attribute { }
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method |
AttributeTargets.Property | AttributeTargets.Field,
Inherited = false)]
public class NotInheritedAttribute : Attribute { }
[InheritedAttribute]
public class BaseA {
[InheritedAttribute]
public virtual void MethodA() { }
}
public class DerivedA : BaseA {
public override void MethodA() { }
}
[NotInheritedAttribute]
public class BaseB {
[NotInheritedAttribute]
public virtual void MethodB() { }
}
public class DerivedB : BaseB {
public override void MethodB() { }
}
Во-вторых, проверьте атрибуты.
class Program {
static void Main(string[] args) {
Type typeA = typeof(DerivedA);
Console.WriteLine($"DerivedA has Inherited attribute: {typeA.GetCustomAttributes(typeof(InheritedAttribute), true).Length > 0}");
MethodInfo memberA = typeA.GetMethod(nameof(DerivedA.MethodA));
Console.WriteLine($"DerivedA.MemberA has Inherited attribute: {memberA.GetCustomAttributes(typeof(InheritedAttribute), true).Length > 0}\n");
Type typeB = typeof(DerivedB);
Console.WriteLine($"DerivedB has NotInherited attribute: {typeB.GetCustomAttributes(typeof(NotInheritedAttribute), true).Length > 0}");
MethodInfo memberB = typeB.GetMethod(nameof(DerivedB.MethodB));
Console.WriteLine($"DerivedB.MemberB has NotInherited attribute: {memberB.GetCustomAttributes(typeof(NotInheritedAttribute), true).Length > 0}");
Console.Read();
}
}
AttributeUsageAttribute. Унаследованное имущество