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:
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).
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.