Назначьте атрибут уровня класса базовому классу, и он также должен быть назначен всем производным классам - PullRequest
0 голосов
/ 09 июля 2020

У меня есть настраиваемый атрибут

[AttributeUsage(AttributeTargets.Class)]
    public sealed  class CustomAttribute: Attribute
    {
        public CustomAttribute()
        {
        }
    }

, который я использую во многих классах, таких как

[CustomAttribute]
    public class ClassOne: MyBaseClass
    {
     .
     .

, поэтому у меня есть много классов, производных от MyBaseClass и будет много изменений, если я захочу добавить этот атрибут во все классы. я хочу, чтобы я добавил этот атрибут в свой базовый класс, и все производные классы также должны иметь тот же атрибут, назначенный им.

как

[CustomAttribute]
    public class MyBaseClass
    {
     .
     .

, но это не решает проблема, в мои дочерние классы все еще не добавлен атрибут. есть ли способ добиться этого?

Ответы [ 3 ]

3 голосов
/ 09 июля 2020

Вы должны использовать свойство [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. Унаследованное имущество

1 голос
/ 09 июля 2020

У меня сработали оба решения - @ddfra и @gurkan.

Я отредактировал свой код вот так, чтобы получить список атрибутов, и он тоже работает.

var attributesList = GetType().GetCustomAttributes<CustomAttribute>(inherit: true);
1 голос
/ 09 июля 2020

Вопрос в том, как вы используете этот атрибут? Потому что, если у вас есть такая ситуация:

 [Custom]
 public class BaseClass {}

 public class AClass : BaseClass {}

, а вы делаете

 CustomAttribute ca = typeof(AClass).GetCustomAttributes(true).FirstOrDefault(x => x is CustomAttribute) as CustomAttribute;

ca не равно null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...