L'héritage des Attributs Personnalisés sur Propriétés Abstraites
J'ai un attribut personnalisé que je veux appliquer ma base de classe abstraite, de sorte que je ne peux ignorer les éléments qui n'ont pas besoin d'être consulté par l'utilisateur lors de l'affichage de l'élément HTML. Il semble que les propriétés de la substitution de la classe de base ne sont pas hériter des attributs.
Ne surchargeant les propriétés de base (abstraite ou virtuelle) de souffler les attributs placés sur l'origine de la propriété?
À partir de l'Attribut de classe Defination de
[AttributeUsage(AttributeTargets.Property,
Inherited = true,
AllowMultiple = false)]
public class NoHtmlOutput : Attribute
{
}
De La Classe Abstraite Defination De
[NoHtmlOutput]
public abstract Guid UniqueID { get; set; }
À Partir De La Classe De Béton Defination De
public override Guid UniqueID{ get{ return MasterId;} set{MasterId = value;}}
De la classe de vérification pour l'attribut
Type t = o.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
if (pi.GetCustomAttributes(typeof(NoHtmlOutput), true).Length == 1)
continue;
//processing logic goes here
}
Vous devez vous connecter pour publier un commentaire.
Non, les attributs sont hérités.
C'est le
GetCustomAttributes()
méthode qui ne regarde pas le parent déclarations. Il ne regarde que des attributs pour le membre spécifié. À partir de la documentation:Au lieu de l'appeler PropertyInfo.GetCustomAttributes(...), il faut appeler la méthode statique du Système.Attribut.GetCustomAttributes(pi,...), comme dans:
mytype.GetCustomAttributes()
àSystem.Attribute.GetCustomAttribute()
rend leinherit
paramètre comme il est censé le faire. La magie!DataMemberAttribute
ne seront pas listés.System.Attribute
.Dirait qu'il ne se produit que lorsque la méthode de remplacement a aussi l'attribut .
http://msdn.microsoft.com/en-us/library/a19191fh.aspx
Cependant, vous pouvez remplacer les attributs du même type ou d'appliquer des attributs supplémentaires à la dérivée de la composante. Le fragment de code suivant montre un contrôle personnalisé qui remplace le Texte de la propriété héritée de Contrôle en remplaçant la BrowsableAttribute attribut appliqué dans la classe de base.
Visual Basic
Ici est une tentative de ma part. C'est une méthode d'extension sur
MemberInfo
manuellement marche vers le haut de la hiérarchie d'héritage. Cela semble être compatible avec des proxies dynamiques...au moins tuyau créé par le Château de toute façon, alors je suis en supposant qu'il serait compatible avec n'importe quel proxy bibliothèque.Et vous pouvez l'utiliser comme ça.
Vous pouvez utiliser
qui fonctionne très bien, voir l'exemple:
https://dotnetfiddle.net/2IhEWH
donc, il n'est pas nécessaire d'utiliser la méthode statique