vererben - vererbung c# ziele




Vererbung von benutzerdefinierten Attributen auf abstrakte Eigenschaften (4)

Ich habe ein benutzerdefiniertes Attribut, das ich auf meine abstrakte Basisklasse anwenden möchte, sodass ich Elemente überspringen kann, die nicht vom Benutzer angezeigt werden müssen, wenn das Element in HTML angezeigt wird. Es scheint, dass die Eigenschaften, die die Basisklasse überschreiben, die Attribute nicht übernehmen.

Überschreibt das Überschreiben von Basiseigenschaften (abstrakt oder virtuell) Attribute, die auf der ursprünglichen Eigenschaft platziert sind?

Aus Attributklasse Definition

[AttributeUsage(AttributeTargets.Property,
                Inherited = true,
                AllowMultiple = false)]
public class NoHtmlOutput : Attribute
{
}

Aus abstrakter Klasse Definierung

[NoHtmlOutput]
public abstract Guid UniqueID { get; set; }

Aus der Definition der Betonklasse

public override Guid UniqueID{ get{ return MasterId;} set{MasterId = value;}}

Von der Klasse, die nach Attribut sucht

        Type t = o.GetType();
        foreach (PropertyInfo pi in t.GetProperties())
        {
            if (pi.GetCustomAttributes(typeof(NoHtmlOutput), true).Length == 1)
                continue;
            // processing logic goes here
        }

Anstatt PropertyInfo.GetCustomAttributes (...) aufzurufen, müssen Sie die statische Methode System.Attribute.GetCustomAttributes (pi, ...) wie folgt aufrufen:

PropertyInfo info = GetType().GetProperties();

// this gets only the attributes in the derived class and ignores the 'true' parameter
object[] DerivedAttributes = info.GetCustomAttributes(typeof(MyAttribute),true);

// this gets all of the attributes up the heirarchy
object[] InheritedAttributes = System.Attribute.GetCustomAttributes(info,typeof(MyAttribute),true);

Es sieht so aus, als ob es nur passiert, wenn die überschreibende Methode auch das Attribut besitzt.

http://msdn.microsoft.com/en-us/library/a19191fh.aspx

Sie können jedoch Attribute desselben Typs überschreiben oder zusätzliche Attribute auf die abgeleitete Komponente anwenden. Das folgende Codefragment zeigt ein benutzerdefiniertes Steuerelement, das die von Control geerbte Texteigenschaft überschreibt, indem das in der Basisklasse angewendete BrowsableAttribute-Attribut überschrieben wird. Visual Basic

Public Class MyControl
   Inherits Control
   ' The base class has [Browsable(true)] applied to the Text property.
   <Browsable(False)>  _
   Public Overrides Property [Text]() As String
      ...
   End Property 
   ...
End Class

Nein, Attribute werden vererbt.

Es ist die GetCustomAttributes() -Methode, die keine übergeordneten Deklarationen betrachtet. Es werden nur Attribute betrachtet, die auf das angegebene Element angewendet wurden. Aus den Dokumenten :

Bemerkungen

Diese Methode ignoriert den Parameter erben für Eigenschaften und Ereignisse. Verwenden Sie die entsprechenden Überladungen der Methode Attribut .. ::. GetCustomAttributes, um die Vererbungskette nach Attributen für Eigenschaften und Ereignisse zu durchsuchen.


Sie können verwenden

PropertyInfo::GetCustomAttributes<T>(true)

Das funktioniert gut, siehe Beispiel: https://dotnetfiddle.net/2IhEWH

Daher muss die statische Methode nicht verwendet werden

System.Attribute.GetCustomAttributes




abstract-class