C # a-t-il des propriétés d'extension?
Par exemple, puis-je ajouter une propriété d'extension à DateTimeFormatInfo
appelée ShortDateLongTimeFormat
qui retourneraitShortDatePattern + " " + LongTimePattern
?
C # a-t-il des propriétés d'extension?
Par exemple, puis-je ajouter une propriété d'extension à DateTimeFormatInfo
appelée ShortDateLongTimeFormat
qui retourneraitShortDatePattern + " " + LongTimePattern
?
?
enum
qui peuvent avoir des propriétés et des méthodes. Les C #enum
ne peuvent pas avoir de propriétés ou de méthodes, mais vous pouvez créer des méthodes d'extension dessus. Cette question m'a été utile et ne devrait pas être close.Réponses:
Pour le moment il n'est toujours pas supporté par le compilateur Roslyn ...
Jusqu'à présent, les propriétés d'extension n'étaient pas considérées comme suffisamment valables pour être incluses dans les versions précédentes de la norme C #. C # 7 et C # 8.0 ont vu cela comme un champion de la proposition, mais cela n'a pas encore été publié, surtout parce que même s'il existe déjà une implémentation, ils veulent le faire dès le départ.
Mais ça va ...
Il existe un élément de membre d'extension dans la liste de travail C # 7 , il peut donc être pris en charge dans un proche avenir. Le statut actuel de la propriété d'extension peut être trouvé sur Github sous l'élément connexe .
Cependant, il y a un sujet encore plus prometteur qui est le "tout étendre" avec un accent particulier sur les propriétés et les classes statiques ou même les champs.
De plus, vous pouvez utiliser une solution de contournement
Comme spécifié dans cet article , vous pouvez utiliser la
TypeDescriptor
capacité pour attacher un attribut à une instance d'objet au moment de l'exécution. Cependant, il n'utilise pas la syntaxe des propriétés standard.C'est un peu différent du sucre syntaxique, ajoutant une possibilité de définir une propriété étendue comme
string Data(this MyClass instance)
un alias pour la méthode d'extensionstring GetData(this MyClass instance)
car il stocke des données dans la classe.J'espère que C # 7 fournira une extension complète (propriétés et champs), mais sur ce point, seul le temps nous le dira.
Et n'hésitez pas à contribuer car le logiciel de demain proviendra de la communauté.
Mise à jour: août 2016
Comme l'équipe dotnet a publié les nouveautés de C # 7.0 et d'un commentaire de Mads Torgensen :
Il semble que les propriétés d'extension et d'autres membres soient toujours de bons candidats à inclure dans une future version de Roslyn, mais peut-être pas celle de 7.0.
Mise à jour: mai 2017
Les membres de l'extension ont été fermés en tant que doublon du problème d' extension tout qui est également fermé. La discussion principale portait en fait sur l'extensibilité de type au sens large. La fonctionnalité est désormais suivie ici en tant que proposition et a été supprimée du jalon 7.0 .
Mise à jour: août 2017 - Fonctionnalité proposée par C # 8.0
Bien qu'il ne reste qu'une fonctionnalité proposée , nous avons maintenant une vue plus claire de ce que serait sa syntaxe. Gardez à l'esprit que ce sera également la nouvelle syntaxe des méthodes d'extension:
Similaire aux classes partielles, mais compilé en tant que classe / type séparé dans un assembly différent. Notez que vous pourrez également ajouter des membres statiques et des opérateurs de cette façon. Comme mentionné dans le podcast Mads Torgensen , l'extension n'aura aucun état (elle ne peut donc pas ajouter de membres d'instance privés à la classe), ce qui signifie que vous ne pourrez pas ajouter de données d'instance privée liées à l'instance . La raison invoquée est que cela impliquerait de gérer en interne les dictionnaires et cela pourrait être difficile (gestion de la mémoire, etc ...). Pour cela, vous pouvez toujours utiliser le
TypeDescriptor
/ConditionalWeakTable
technique décrite précédemment et avec l'extension de propriété, la cache sous une belle propriété.La syntaxe est toujours sujette à changement, comme l'indique ce problème . Par exemple,
extends
pourrait être remplacé parfor
lequel certains pourraient se sentir plus naturels et moins liés à Java.Mise à jour de décembre 2018 - Rôles, extensions et membres de l'interface statique
L'extension n'a pas atteint C # 8.0, en raison de certains inconvénients expliqués comme la fin de ce ticket GitHub . Il y a donc eu une exploration pour améliorer la conception. Ici , Mads Torgensen explique quels sont les rôles et extensions et comment ils diffèrent:
Il peut être vu à une division de la proposition précédente dans deux cas d'utilisation. La nouvelle syntaxe d'extension serait la suivante:
alors vous pourriez faire ceci:
Et pour une interface statique :
Ajoutez une propriété d'extension sur
int
et traitez-laint
commeIMonoid<int>
:la source
Non, ils n'existent pas en C # 3.0 et ne seront pas ajoutés en 4.0. Il figure sur la liste des fonctionnalités souhaitées pour C #, il peut donc être ajouté à une date ultérieure.
À ce stade, le mieux que vous puissiez faire est les méthodes d'extension de style GetXXX.
la source
Non, ils n'existent pas.
Je sais que l'équipe C # les envisageait à un moment donné (ou du moins Eric Lippert) - avec les constructeurs et les opérateurs d'extension (cela peut prendre un certain temps pour se faire une idée, mais c'est cool ...) Cependant, je n'ai pas 'ai vu aucune preuve qu'ils feraient partie de C # 4.
EDIT: Ils ne sont pas apparus en C # 5, et en juillet 2014, il ne semble pas non plus que ce sera en C # 6.
Eric Lippert , développeur principal de l'équipe du compilateur C # de Microsoft jusqu'en novembre 2012, a blogué à ce sujet en octobre 2009:
la source
()
fin est beaucoup plus lisible. Je sais pour moi personnellement, au moins 90% des extensions que j'écris sont de ces 2 types.FullName
=FirstName + LastName
,ShortName
=FirstName + LastName[0]
. Je voudrais ajouter plus de ces propriétés, mais je ne veux pas "salir" les classes réelles. Dans ce cas, une propriété d'extension, en lecture seule, est parfaite car je peux ajouter la fonctionnalité, garder la classe principale propre et toujours exposer les informations que je veux exposer dans l'interface utilisateur.static implicit operator FileInfo(FileInfoEx fex)
ce qui renvoie mon objet FileInfo contenu. Cela me permet effectivement de traiter le FileInfoEx comme s'il héritait de FileInfo, même si cette classe est scellée.Mise à jour (merci à @chaost d' avoir signalé cette mise à jour):
Source: section commentaires dans https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/
J'ai cessé de compter combien de fois au fil des ans j'ai ouvert cette question dans l'espoir d'avoir vu cela mis en œuvre.
Eh bien, enfin, nous pouvons tous nous réjouir! Microsoft va introduire cela dans leur prochaine version C # 8.
Alors au lieu de faire ça ...
On va enfin pouvoir le faire comme ça ...
Source: https://blog.ndepend.com/c-8-0-features-glimpse-future/
la source
Comme @Psyonity l'a mentionné, vous pouvez utiliser le conditionalWeakTable pour ajouter des propriétés aux objets existants. Combiné avec le ExpandoObject dynamique, vous pouvez implémenter des propriétés d'extension dynamique en quelques lignes:
Un exemple d'utilisation est dans les commentaires xml:
la source
Parce que j'avais récemment besoin de cela, j'ai regardé la source de la réponse dans:
c # étendre la classe en ajoutant des propriétés
et créé une version plus dynamique:
Il peut probablement être beaucoup amélioré (dénomination, dynamique au lieu de chaîne), je l'utilise actuellement dans CF 3.5 avec un ConditionalWeakTable hacky ( https://gist.github.com/Jan-WillemdeBruyn/db79dd6fdef7b9845e217958db98c4d4 )
la source