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

範例

下列範例說明套用屬性值為之屬性(attribute)的屬性(attribute) AttributeUsageAttribute Inherited true ,以及套用 AttributeUsageAttribute Inherited 屬性值為的 false 屬性(attribute)之間的差異。 此範例會定義兩個屬性: InheritedAttributeNotInheritedAttribute 。 這兩個屬性都可以套用至類別和方法。 因為套用 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 ||| AttributeTargets.Method ||| AttributeTargets.Property ||| AttributeTargets.Field, Inherited = true)>]
type InheritedAttribute() =
    inherit Attribute()

[<AttributeUsage(AttributeTargets.Class ||| AttributeTargets.Method ||| AttributeTargets.Property ||| AttributeTargets.Field, Inherited = false)>]
type NotInheritedAttribute() =
    inherit 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 是,具有單一方法 MethodBBaseAMethodA 會以屬性標記 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
[<Inherited>]
type BaseA() =
    abstract member MethodA: unit -> unit
    [<Inherited>]
    default _.MethodA() = ()

type DerivedA() =
    inherit BaseA()

    override _.MethodA() = ()

[<NotInherited>]
type BaseB() =
    abstract member MethodB: unit -> unit
    [<NotInherited>]
    default _.MethodB() = ()

type DerivedB() =
    inherit BaseB()

    override _.MethodB() = ()

let typeA = typeof<DerivedA>
printfn $"DerivedA has Inherited attribute: {typeA.GetCustomAttributes(typeof<InheritedAttribute>, true).Length > 0}"
let memberA = typeA.GetMethod "MethodA"
printfn $"DerivedA.MemberA has Inherited attribute: {memberA.GetCustomAttributes(typeof<InheritedAttribute>, true).Length > 0}\n"

let typeB = typeof<DerivedB>
printfn $"DerivedB has NotInherited attribute: {typeB.GetCustomAttributes(typeof<NotInheritedAttribute>, true).Length > 0}"
let memberB = typeB.GetMethod "MethodB"
printfn $"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

如範例的輸出所示, DerivedADerivedA.MethodA 繼承 InheritedAttribute 屬性,但是 DerivedBDerivedB.MethodB 不會繼承 NotInheritedAttribute 屬性。

備註

Inherited屬性會決定:

  • 如果衍生自基類的類別是以套用屬性的屬性(attribute)所標記,就 AttributeUsageAttribute 會繼承該屬性(attribute)。

  • 如果衍生類別的方法覆寫的基類方法是以套用屬性的屬性(attribute)所標記,就 AttributeUsageAttribute 會繼承該屬性(attribute)。 (如果類別繼承基類成員,它也會繼承套用至該成員的任何屬性。 )

適用於

另請參閱