AttributeUsageAttribute.Inherited Свойство

Определение

Возвращает или задает значение Boolean, определяющее, наследуется ли указанный атрибут производными классами и переопределяющими элементами.

public:
 property bool Inherited { bool get(); void set(bool value); };
public bool Inherited { get; set; }
member this.Inherited : bool with get, set
Public Property Inherited As Boolean

Значение свойства

Boolean

Возвращает значение true, если атрибут может наследоваться производными классами и переопределяющими элементами. В противном случае — значение false. Значение по умолчанию — true.

Примеры

В следующем примере показана разница между атрибутом, к которому AttributeUsageAttribute применяется атрибут со Inherited значением свойства, true и с тем, к которому AttributeUsageAttribute применяется атрибут со Inherited значением свойства false . В примере определяются два атрибута: InheritedAttribute и NotInheritedAttribute . Оба атрибута могут применяться к классам и методам. Так как Inherited свойство AttributeUsageAttribute атрибута, применяемое к InheritedAttribute , имеет значение true , оно наследуется производными классами и членами производных классов, переопределяющих метод базового класса. С другой стороны, поскольку Inherited свойство AttributeUsageAttribute атрибута, примененного к NotInheritedAttribute , имеет значение false , оно не наследуется производными классами и членами производных классов, переопределяющих метод базового класса.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method |
                AttributeTargets.Property | AttributeTargets.Field,
                Inherited = true)]
public class InheritedAttribute : Attribute
{ }

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method |
                AttributeTargets.Property | AttributeTargets.Field,
                Inherited = false)]
public class NotInheritedAttribute : Attribute
{ }
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method _
                Or AttributeTargets.Property Or AttributeTargets.Field,
                Inherited:=True)>
Public Class InheritedAttribute : Inherits Attribute
End Class

<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method _
                Or AttributeTargets.Property Or AttributeTargets.Field,
                Inherited:=False)>
Public Class NotInheritedAttribute : Inherits Attribute
End Class

Затем в примере определяются два базовых класса. Первый, BaseA , имеет единственный метод, MethodA . Второй метод, BaseB ,, имеет единственную, MethodB . BaseA и помечены атрибутом и помечены MethodA InheritedAttribute BaseB MethodB NotInheritedAttribute атрибутом. DerivedA наследует от BaseA и переопределяет его MethodA метод. DerivedB наследует от BaseB и переопределяет его MethodB метод.

using System;
using System.Reflection;

[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()
    { }
}

public class Example
{
    public static void Main()
    {
        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}");
    }
}
// The example displays the following output:
//       DerivedA has Inherited attribute: True
//       DerivedA.MemberA has Inherited attribute: True
//
//       DerivedB has NotInherited attribute: False
//       DerivedB.MemberB has NotInherited attribute: False
Imports System.Reflection

<InheritedAttribute> Public Class BaseA
    <InheritedAttribute> Public Overridable Sub MethodA()
    End Sub
End Class

Public Class DerivedA : Inherits BaseA
    Public Overrides Sub MethodA()
    End Sub
End Class

<NotInheritedAttribute> Public Class BaseB
    <NotInheritedAttribute> Public Overridable Sub MethodB()
    End Sub
End Class

Public Class DerivedB : Inherits BaseB
    Public Overrides Sub MethodB()
    End Sub
End Class

Module Example
    Public Sub Main()
        Dim typeA As Type = GetType(DerivedA)
        Console.WriteLine($"DerivedA has Inherited attribute: {typeA.GetCustomAttributes(GetType(InheritedAttribute), True).Length > 0}")
        Dim memberA As MethodInfo = typeA.GetMethod(NameOf(DerivedA.MethodA))
        Console.WriteLine($"DerivedA.MemberA has Inherited attribute: {memberA.GetCustomAttributes(GetType(InheritedAttribute), True).Length > 0}")
        Console.WriteLine()

        Dim typeB As Type = GetType(DerivedB)
        Console.WriteLine($"DerivedB has NotInherited attribute: {typeB.GetCustomAttributes(GetType(NotInheritedAttribute), True).Length > 0}")
        Dim memberB As MethodInfo = typeB.GetMethod(NameOf(DerivedB.MethodB))
        Console.WriteLine($"DerivedB.MemberB has Inherited attribute: {memberB.GetCustomAttributes(GetType(NotInheritedAttribute), True).Length > 0}")
    End Sub
End Module
' The example displays the following output:
'       DerivedA has Inherited attribute: True
'       DerivedA.MemberA has Inherited attribute: True
'       
'       DerivedB has Inherited attribute: False
'       DerivedB.MemberB has Inherited attribute: False

Как видно из выходных данных в примере, DerivedA и DerivedA.MethodA наследует InheritedAttribute атрибут, но DerivedB DerivedB.MethodB не наследовать NotInheritedAttribute атрибут.

Комментарии

InheritedСвойство определяет:

  • Наследуется ли класс, производный от базового класса, помеченного атрибутом, к которому AttributeUsageAttribute применяется атрибут.

  • Являются ли методы производных классов, переопределяющих метод базового класса, помеченный атрибутом AttributeUsageAttribute , к которому применяется атрибут, наследуют этот атрибут. (Если класс наследует член базового класса, он также наследует все атрибуты, примененные к этому элементу.)

Применяется к

См. также раздел