Écraser l’atsortingbut personnalisé sur la classe dérivée

Nous avons un atsortingbut personnalisé

[AtsortingbuteUsage(AtsortingbuteTargets.All, AllowMultiple = true)] public class CustomDesignerAtsortingbute: Atsortingbute 

alors nous avons une classe de base décorée avec cet atsortingbut

 [CustomDesigner(someKey, someValue)] public class BaseClass 

alors nous avons une classe dérivée de celle-ci, décorée avec le même atsortingbut (avec la même clé, valeur différente)

 [CustomDesigner(someKey, someOtherValue)] public class ChildClass : BaseClass 

Est-il possible que ChildClass ne crée pas un duplicata d’atsortingbut mais écrase une valeur pour une clé existante (écrase l’atsortingbut parent entier)? Sinon, quel est le meilleur modèle pour obtenir la valeur par défaut de BaseClass si ChildClass n’a pas défini la sienne?

Non, il n’est pas possible de remplacer l’atsortingbut existant.

Les atsortingbuts sont des métadonnées attachées à un object (assembly, classe, méthode, variable, etc.), de sorte qu’ils conservent toujours cette connexion .

Si vous voulez donner un “comportement” par défaut dans la classe de base et la remplacer dans certaines classes dérivées, vous devez vérifier tous les atsortingbuts renvoyés par GetCustomAtsortingbutes() pour utiliser uniquement le plus dérivé (le premier de la liste).

Je pense que c’est possible de la manière suivante:

1. Utilisation de TypeDescriptor

Dans votre CustomDesignerAtsortingbute TypeId :

 public override object TypeId { get { return Key.GetHashCode(); } } 

L’implémentation de base de TypeId utilise simplement le type d’atsortingbut, aucun paramètre n’est donc impliqué.

Ensuite, vous pouvez utiliser TypeDescriptor.GetAtsortingbutes(typeof(ChildClass)).OfType()

TypeDescriptor (contrairement à GetType().GetCustomAtsortingbutes ) ne renvoie qu’un atsortingbut basé sur le même TypeId . Je l’ai testé et c’est l’atsortingbut le plus dérivé correspondant à TypeId qui est renvoyé.

Donc, si votre TypeId représente la clé de votre atsortingbut, vous pouvez l’écraser sur des classes dérivées – lorsque vous utilisez TypeDescriptor pour obtenir l’atsortingbut! Notez que plusieurs atsortingbuts sont toujours possibles tant qu’ils diffèrent par leur clé.

Remarque: TypeDescriptor trouve également les atsortingbuts ajoutés dynamicment (ajoutés au moment de l’exécution).

2. Utiliser Remove Property

Vous pouvez append un bool Remove { get; set; } public bool Remove { get; set; } bool Remove { get; set; } bool Remove { get; set; } à votre CustomDesignerAtsortingbute . Vous pouvez le définir sur true dans votre classe dérivée tout en définissant les autres parameters identiques à l’atsortingbut de classe de base à supprimer. Ajoutez ensuite un autre atsortingbut avec la même clé mais la valeur souhaitée dans votre classe dérivée. Lors de l’obtention des atsortingbuts, vous devez évaluer la propriété Remove de manière intelligente. En utilisant TypeDescriptor comme dans 1) avec TypeId par exemple en renvoyant Key.HashCode() + Value.GetHashCode() ou en utilisant GetType().GetCustomAtsortingbutes , vous devez parcourir la liste des atsortingbuts et filtrer dans les deux sens. Vous devez savoir dans quel ordre sont ces listes, si la plupart des types dérivés sont les premiers ou inversement.

utilisez [AtsortingbuteUsage(Inherited=false)] pour éviter que l’atsortingbut ne soit hérité par la classe dérivée.