Quels sont vos préférés des méthodes d'extension pour C#? (codeplex.com/extensionoverflow)
Nous allons faire une liste de réponses où vous postez votre excellent et favori les méthodes d'extension.
L'exigence est que le code complet doit être publié et un exemple et une explication sur la façon de l'utiliser.
Basé sur le haut intérêt pour ce sujet j'ai en place un Projet Open Source appelé extensionoverflow sur Codeplex.
Veuillez indiquer vos réponses avec une acceptation de mettre le code dans le projet Codeplex.
Veuillez poster le code source complet et non un lien.
Codeplex News:
24.08.2010 La Codeplex page est maintenant ici: http://extensionoverflow.codeplex.com/
11.11.2008 XmlSerialize /XmlDeserialize est maintenant Mise en œuvre et Unité Testé.
11.11.2008 Il y a encore de la place pour plus de développeurs. 😉 Inscrivez-vous MAINTENANT!
11.11.2008 Troisième contributer rejoint ExtensionOverflow, bienvenue à BKristensen
11.11.2008 FormatWith est maintenant Mise en œuvre et Unité Testé.
09.11.2008 Deuxième contributer rejoint ExtensionOverflow. bienvenue à chakrit.
09.11.2008 Nous avons besoin de plus de développeurs. 😉
09.11.2008 ThrowIfArgumentIsNull en maintenant Mise en œuvre et Unité Testé sur Codeplex.
Erik malheureusement tout est commencé aujourd'hui sur codeplex. S'il vous plaît joindre de toute façon.
Semble assez bon. J'ai un commentaire à propos de nommer les classes statiques. Les nommant <type>Extensions n'est pas très instructif. Par exemple StringExtensions détient à la fois le format xml et des trucs. Je pense que c'est mieux de le nom de la classe avec laquelle vous êtes à l'extension de ce type. Par exemple UnixDateTimeConversions. Vous pouvez raisonnablement suppose qu'il détient les méthodes de conversion et de temps Unix. Juste une pensée!
Cochez cette URL pour en savoir plus sur C# les Méthodes d'Extension planetofcoders.com/c-extension-methods
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Me permet de remplacer:
Avec:
Peut-être "EqualsAnyOf" serait un meilleur nom que "Dans"?
Je ne suis pas sûr que je l'aime - j'aime la brièveté de
In
, mais peut-êtreIsIn
serait mieux.En utilisant la même méthode contains: (nouveau[] { 1, 2, 3 }).Contient(a)
J'ai pensé à
In<T>(...)
ainsi et l'a trouvé pour être le plus utile de la méthode d'extension à l'extérieur de la bibliothèque standard. Mais je suis en désaccord avec le nomIn
. Un nom de méthode est censé être en décrivant ce qu'il fait, maisIn
ne pas le faire. Je l'ai appelé ilIsAnyOf<T>(...)
, mais je suppose queIsIn<T>(...)
serait suffisante en tant que bien.OriginalL'auteur
J'ai plusieurs méthodes d'extension dans mon MiscUtil projet (source complet est disponible là - je ne vais pas répéter ici). Mes favoris, dont certains concernent d'autres classes (comme les plages):
Date et l'heure de trucs surtout pour les tests unitaires. Pas sûr que j'avais utiliser en production 🙂
Plages et pas à pas - un énorme merci à Marc Gravel pour son opérateur de trucs rendre cela possible:
Comparaisons:
Vérification Argument:
LINQ to XML appliqué à des types anonymes (ou d'autres types avec des propriétés appropriées):
Pousser LINQ - serait trop long à expliquer ici, mais qu'il recherche.
Vous pouvez déjà voir le code. Suivez le lien dans la première phrase - source complet est là.
Je préfère le faire moi-même, de le mettre sur code.google.com et de gérer le projet moi-même, si vous n'avez pas l'esprit. Évidemment, vous êtes dans le permis de la mettre sur Codeplex si vous gardez l'attribution appropriée, mais je préfère faire le tri moi-même peu sauf si vous êtes désespéré 🙂
Skeet. Son mettre sous la licence MIT libre d'utilisation pour tout le monde. Commercialement ou open source. Pourquoi ne pas unir nos forces et faire une extension des méthodes de la bibliothèque pour le public.
C'est probablement un bon moment pour ne pas utiliser le var.
OriginalL'auteur
chaîne.Format raccourci:
Exemple:
Rapide copier-coller d'aller ici.
Ne trouvez-vous pas plus naturel de type
"some string".F("param")
au lieu destring.Format("some string", "param")
?Pour une plus lisible nom, essayez l'une de ces suggestion:
..
Juste le renommer comme vous le souhaitez...
Je pense que la lisibilité est plus important dans le grand projet de votre code que quelques abréviation déclarations qui pourraient être rapidement regardé/demandé.
Personnellement, je voudrais un distinct objet de Formatage, la BCL a pu analyser le modèle de la fois et de les réutiliser. Ce qui permettrait d'augmenter la lisibilité et la performance. J'ai demandé à l'équipe BCL - nous allons voir...
Ok... je viens juste de le mettre en action et est allé avec .Avec-de sorte que vous obtenez "C'est un {0}".("Test") et c'est très lisible et de la logique. Pour info
OriginalL'auteur
Sont ces toute utilisation?
Couple de choses: je recommande
OneOf
doit accepter aucunIList<T>
. Ensuite, vous pouvez toujours aussi ont une surcharge qui prend unparams
arg et transmet simplement que dans leIList<T>
de surcharge. J'ai donné une réponse (en bas, en bas à droite maintenant) avec unNextBool
méthode similaire à votreCoinToss
, mais avec une surcharge qui prend unprobability
paramètre (ce que si je veux quelque chose de 75% du temps?). Aussi, juste une petite bête: votre exemple de code va jeter unNullReferenceException
depuisrand
n'est jamais initialisée.+1 j'aime vraiment ça, mais je préfère
CoinToss
à être mis en œuvre avecrng.NextDouble() < .5
parce que l'interne.Next(int)
est faite avec.NextDouble()
de sorte que vous vous enregistrez un casting, a * et un chèque.OriginalL'auteur
Exemple:
Ne serait pas le nom de "IsBetween" plus de sens? Aussi peut-être faire un IsBetweenInclusive et IsBetweenExclusive. Aucune idée de qui l'un à prendre pour défaut.
il fait plus de sens que s'il s'agissait d'un datetime extension.
Pour moi entre les implique: 5.Entre(5,10) retourne false, et 10.Entre(5,10) renvoie la valeur false. Qui se sent tout simplement naturel pour moi.
Il me semble que plusieurs personnes ont des idées différentes de ce qui est naturel. De ce fait, il devrait probablement être déclaré de manière explicite ce qui est utilisé (c'est à dire Inclusive vs Exclusif), car cela pourrait être un très facile source d'erreurs.
OriginalL'auteur
La méthode d'extension:
La méthode s'applique pour tous les types et vous permet d'ajouter des éléments à une liste de paramètres.
Exemple:
Suffit d'utiliser la collecte de l'initialiseur =>
var list = new List<int>{5,4,8,4,2};
Pourquoi ne pas simplement appeler la Liste des<T>.AddRange(IEnumerable<T> collection) à l'intérieur de votre méthode?
En fait, il serait pour accepter un
ICollection<T>
; il peut aussi être utilisé, par exemple,LinkedList<T>
etHashSet<T>
, et pas seulement les collections indexées.Édité à permet de covariance dans pre-.net 4.0
OriginalL'auteur
Par tous les moyens de mettre cela dans le projet codeplex.
De la sérialisation /Désérialisation des objets au format XML:
ToXml()
(commeToString()
)Toutes mes excuses pour l'OP si il a intentionnellement écrit de cette façon, mais l'utilisation de MemoryStreams ET XmlReader/XmlWriter a été exagéré. Le StringReader et StringWriter classe sont parfaits pour cette opération.
Attention, ce n'est pas thread-safe. Vous devriez certainement synchroniser votre accès à la statique serialisers dictionnaire.
Il est beaucoup plus facile si vous venez d'ajouter le "fil statique" de l'attribut. Puis un nouveau cache sera créé par thread. Pas besoin de synchronisation.
C Dickinson: Il apparaît à partir de la MSDN docs ici msdn.microsoft.com/en-us/library/... que le constructeur qui est utilisé (new XmlSerializer(type)) n'est pas un problème de fuite de mémoire. Alors peut-être que le code de mise en cache n'est pas nécessaire?
OriginalL'auteur
ForEach pour IEnumerables
Naïf exemple:
Cool exemple:
Remarque:
Ce n'est pas comme
Select
parce queSelect
attend votre fonction pour retourner quelque chose comme pour les transformer en une autre liste.ForEach permet simplement de vous exécuter quelque chose pour chacun des items sans transformation/de manipulation de données.
J'ai fait ce que je puisse le programme en plus de style fonctionnel et j'ai été surpris de voir que la Liste a un ForEach tout IEnumerable ne pas.
Mettre cela dans le projet codeplex
Je vous recommande de lire ceci avant d'utiliser la méthode: blogs.msdn.com/ericlippert/archive/2009/05/18/...
C'est juste de la démagogie Microsoft
Et votre commentaire est juste des préjugés à l'encontre de Microsoft. Il n'est pas invalidade tout mot écrit par Eric. Quelqu'un les arguments ne sont pas valide ou non valide seulement à cause de la société qu'il/elle travaille.
En passant, permettez-moi de préciser un point. Je ne dis pas que vous ne devriez pas utiliser ce ForEach méthode d'extension. J'ai juste dit que vous devriez considérer les points qui Eric exposés avant de décider ou non de l'utiliser. Je l'ai lu et j'ai décidé de ne pas l'utiliser. Vous êtes libre de faire ce que vous voulez avec votre code.
OriginalL'auteur
Ma conversion des extensions qui vous permettent de le faire:
Ici, il est, comme posté sur TheSoftwareJedi.com
Vous pouvez demander par défaut (appels vierges constructeur ou "0" pour les objets numériques) en cas d'échec, spécifiez une valeur "par défaut" (que j'appelle "les autres"), ou de demander de l'null (où T : de la classe). J'ai également fourni à la fois silencieux exception des modèles, et un type de TryParse modèle qui renvoie un booléen indiquant les mesures prises, et un param contient la nouvelle valeur.
Donc, notre code peut faire des choses comme ça
Je ne pouvais pas obtenir les types Nullables à rouler dans le tout très proprement. J'ai essayé pendant environ 20 minutes avant que j'ai jeté l'éponge.
Personnellement, je ne suis pas un fan de code try / catch pour déterminer le résultat. Try / catch devraient être utilisés pour les erreurs qui se produisent en dehors de la logique, de l'OMI. hmmmmm
Si je ne voulais pas vous utiliser le code, je n'aurais pas posté! 🙂
Vous devriez au moins le changement que les "attraper" clause à seulement attraper les exceptions qui ChangeType() va augmenter quand il ne peut pas "convertir" à la référence. Je pense que vous ne souhaitez pas avoir d'exception OutOfMemoryException, ExecutionEngineException, ThreadAbortException, ou comme étant traitée comme une erreur de conversion. Ces choses, autrement, être assez difficile à suivre, les erreurs.
Je crois
ToOrNull
a exactement le même comportement queToOrDefault
(c'est à dire, si vous appelezToOrDefault
sur un type de référence avec un échec de la conversion, il sera de retournull
). Mais plus important encore, il semble genre de redondant pour moi depuisvar s = myObject as string
accomplit la même chose quevar s = myObject.ToOrNull<string>()
-- mais potentiellement sans avoir à prendre unInvalidCastException
. Ai-je raté quelque chose?OriginalL'auteur
J'ai une méthode d'extension pour l'enregistrement des exceptions:
Et il est utilisé comme ceci:
[désolé de poster deux fois; la 2ème est mieux conçu :-)]
Je pense que c'est bon pour la BCL ou 3ème partie des exceptions, mais si vous roulez vos propres types d'exception, vous pouvez placer l'exploitation forestière dans votre base de classe d'exception. De cette façon, vous n'avez pas à vous rappeler de le Journal des appels().
OriginalL'auteur
Utile pour analyser une chaîne de caractères dans un Enum.
De crédit va à Scott Dorman
--- Edit pour le projet Codeplex ---
J'ai demandé à Scott Dorman si il serait à nous de la publication de son code dans le projet Codeplex. C'est la réponse que j'ai reçu de lui:
Wow, j'ai été méthodes d'écriture de la carte des chaînes pour les énumérations (juste commencé à l'utiliser .NET). Merci, ce sera absolument aider!
vous devez ajouter sdorman pour le projet.
Vous pourriez aussi envisager de nommer ce ToEnum<>(), puisqu'elle vient après l'objet.
Je ne pense pas que cette méthode doit utiliser le Trim. Tailler l'apport doit être de la responsabilité de l'appelant.
OriginalL'auteur
Je la trouve assez utile:
Vous pouvez l'utiliser sur CodePlex.
thedailywtf.com/articles/the_brillant_paula_bean.aspx
hahaha Viens de lire l'article (Joël commentaire ci-dessus) - drôle vrai, mais après avoir été à peu près dans le même bateau (sur la réception de fin, pas les Paula fin) c'est drôle que de regarder en arrière! Une fois eu un entrepreneur amené à travailler sur un projet que j'avais designigner/lead dev sur - elle n'était pas sous mon contrôle direct, mais a été attribué travail de mes équipes de travail. Boss salué comme étant l'brillant (même la location d'elle de nouveau, plus tard, comme un Dev de Plomb!). Ils ne se doutaient pas que chaque morceau de code qu'elle a écrit ou conçu n'a pas eu de production et tout a dû être complètement réécrit à partir de zéro par mon équipe!
OriginalL'auteur
DateTimeExtensions
Exemples:
D'accord, "WithTime" sonne mieux...
DateTime.Maintenant.Premier (le) - quoi? C'est qu'apparente, à partir de l'exemple de code.
Très agréable. Mais convenez que le nom pourrait être beaucoup mieux.
DateTime.Maintenant.La première sera assez clair dans Intellisense si la méthode est bien documenté.
OriginalL'auteur
gitorious.org/cadenza est une bibliothèque complète de certains des plus utiles à l'extension des méthodes que j'ai vu.
(Je parle de la version, pas celle dont vous avez besoin pour l'utilisation de la source de contrôle pour obtenir)
Il a été rendu obsolète par la Cadenza. gitorious.org/cadenza
Peut-on avoir des exemples?
OriginalL'auteur
Ici est celui que j'utilise fréquemment pour la présentation la mise en forme.
OriginalL'auteur
Voici un va-et-à partir de chiffres Romains. Pas souvent utilisé, mais qui pourrait être à portée de main. Utilisation:
La source:
Pas étonnant que la chute de l'empire.
Cela me rappelle le Python PEP 313, qui était un poisson d'avril blague à inclure Chiffre Romain littéraux en python: python.org/dev/peps/pep-0313
OriginalL'auteur
Un moyen pratique pour faire face avec des tailles:
OriginalL'auteur
Pour Winform Contrôles:
IsDesignTime Utilisation:
SetDropdownWidth Utilisation:
J'ai oublié de mentionner, n'hésitez pas à utiliser ces sur Codeplex...
OriginalL'auteur
La ThrowIfArgumentIsNull est une belle façon de faire que nulle vérifier que nous devrions tous faire.
Ci-dessous est la manière de l'utiliser et il fonctionne sur toutes les classes dans votre espace de noms ou partout où vous utilisez l'espace de noms à l'intérieur.
C'est ok pour utiliser ce code sur le CodePlex projet.
Ouais! c'est un kewl extension de la méthode de trop 🙂
Si vous utilisez le ArgumentNullException-constructeur avec seulement 1 chaîne-argument, l'argument doit être le nom du paramètre, et non pas le message d'erreur. Ainsi, votre code devrait ressembler à ceci: if (obj == null) throw new ArgumentNullException(parameterName);
Je voudrais utiliser
default(T)
pour cela, et de supprimer l'exigence de classe.Non-valeurs par défaut pour les types natifs sont légitimes des arguments plus souvent que les valeurs null. La vérification par rapport à null plus de sens pour moi que de la vérification par défaut. Bien sûr, je viens de le généraliser à l'ensemble de l'idée en disant
Require.ThatArgument(input != null)
ouRequire.ThatArgument(personId > 0)
. Il ne prend pas beaucoup plus de code, c'est beaucoup plus souple, et il lit très bien. J'ai d'autres remplacements prendre funcs pour lorsque vous souhaitez personnaliser le message d'erreur ou l'exception de lui-même.OriginalL'auteur
Je m'ennuie de la Visual Basic Avec déclaration quand passer au C#, donc ici, il va:
Et voici comment l'utiliser en C#:
Permet d'économiser beaucoup de la saisie!
Comparer:
mis en codeplex projet
J'ai aussi utiliser le c# 3.0 propriété de l'initialiseur de syntaxe dans la mesure du possible pour atteindre le même résultat.
voici un exemple. Il s'applique uniquement lors de la création de l'objet Bouton n = new Button { Nom = "Bouton1", Largeur = 100, Hauteur = 20, Enabled = true };
Ce serait utile lorsque vous avez beaucoup d'événements pour le brancher, parce que le C#'s de la propriété de l'initialiseur de la syntaxe ne prend pas en charge les événements.
c'est aussi divers à l'extérieur de la propriété des initialiseurs, parce que vous ne pouvez les utiliser lors de la création d'un nouvel objet. cette extension peut travailler sur des objets créés.
OriginalL'auteur
Prend un camelCaseWord ou PascalCaseWord et "wordifies", c'est à dire camelCaseWord => camel Cas de Mot
J'ai souvent l'utiliser en conjonction avec Capitaliser
Exemple d'utilisation
Libre de les utiliser dans le projet codeplex
OriginalL'auteur
J'ai trouvé utile
Il supprime la valeur null est à vérifier dans le code appelant. Vous pouvez maintenant faire
Ce qui me fait peur légèrement
OriginalL'auteur
Convertir un double en string formaté à l'aide de la culture spécifiée:
Exemple:
Qu'en utiliser un Enum dans le paramètre à la place de la plaine de la chaîne
Rulas : car il n'y a pas un nombre fixe de cultures...
OriginalL'auteur
Ci-dessous est un méthode d'extension qui s'adapte Rick Strahl du code (et les commentaires aussi) pour vous empêcher de vous avoir à deviner ou à lire la marque d'ordre des octets d'un tableau d'octets ou de fichier texte chaque fois que vous le convertir en chaîne.
Le bout de code vous permet de tout simplement faire:
Si vous trouvez des bugs s'il vous plaît ajouter aux commentaires. N'hésitez pas à inclure dans le projet Codeplex.
Si vous êtes à la rédaction d'un éditeur de texte, c'est probablement de bons de souscription d'une extension de la méthode, mais je suis d'accord la plupart du temps, c'est probablement pas plus d'une statique méthode privée
OriginalL'auteur
En voici un que je viens de créer aujourd'hui.
Il vous permet de faire cela:
qui est plus à l'aise et (OMI) plus facile à lire que cela:
thingy.NullOr(t => t.Count)
, oùCount
est un int ? Vous devez retournerdefault(TReturn)
plutôt que null, de cette façon, vous n'aurez pas besoin d'class
contrainte et il va travailler pour les types de valeur tropL'étain doit être une classe, sinon la totalité de cette méthode d'extension n'a pas de sens (types de valeur ne peut pas être null). Et votre exemple avec t.Le comte est le travail avec l'extension de la méthode. Pourriez-vous prendre un second regard?
c'est une méthode utile à un problème commun. Cependant, je crois
TReturn elseValue = default(TReturn)
est uniquement disponible pour les .NET 4.0? J'ai 3.5 SP1 et je n'ai jamais vu que de construire (ni a mon compilateur). Je viens de déménager ce à l'intérieur de la méthode. Une question, cependant, est que la boxe nullable type d'objet pour l'utiliser avec la méthode donne un résultat inattendu (0 vs attend null).le
default(T)
mot-clé a été là depuis VS2005, mais je pense que les paramètres par défaut est une nouvelle .NET 4 fonction. Le moyen facile de contourner il faut avoir deux variantes, l'une qui prend le param et celui qui n'en a pas. Je vais mettre à jour la réponse à être CLR 2.0 compatible. Quant à la boxe, c'est le point dedefault
. Il sera de 0-initialisé données pour un type de valeur, et la valeur null pour tous les types de référence. Un TReturn d'un type de valeur doit rester "unboxed" tout le chemin à travers la fonction.Ma question était sur le paramètre par défaut, j'ai vu que dans les langages dynamiques comme le Rubis. Mon point de vue concernant les types nullables est que le retour
x.Value
doit retourner la valeur null (si, par exemple,int?
était nulle) ou de la valeur siint?
a une valeur. De retour0
quandint? x = null
est passé et la boîte de l'objet est un cas particulier. J'ai vu des vérifications similaires pour les types nullables dans les bibliothèques telles que nhibernate fluent et linfu (je crois) pour ce cas précis, vous permettant d'annuler la contrainte de classe comme suggéré précédemment.OriginalL'auteur
"S'il vous plaît noter vos réponses avec une acceptation de mettre le code dans le projet Codeplex."
Pourquoi? Tous les Trucs sur ce site sous CC-by-sa-2.5, donc il suffit de mettre votre Extension de dépassement de Projet sous la même licence, et vous pouvez l'utiliser librement.
De toute façon, ici, est une Chaîne de caractères.Fonction Reverse, basé sur cette question.
Une mise en œuvre à l'aide de StringBuilder devrait être plus rapide.
La comparaison dans la stackoverflow.com/questions/228038 mesuré que StringBuilder est plus lent.
Vous avez raison. Il semble que le fil exigences de sécurité (probablement pour assurer l'immuabilité de la chaîne de caractères retournée par ToString) lent StringBuilder vers le bas beaucoup de choses.
Espère que vous ne rencontrerez pas de toutes les mères porteuses ou la combinaison de caractères.
OriginalL'auteur
Je suis fatigué de fastidieux null vérification, tout en tirant sur les valeurs de MySqlDataReader, donc:
Bien sûr, cela pourrait être utilisé avec n'importe quel SqlDataReader.
Les deux hangy et Joe avait quelques bons commentaires sur comment faire cela, et depuis, j'ai eu l'occasion de mettre en œuvre quelque chose de similaire dans un contexte différent, voici donc une autre version:
En fait, faire de la "ce" paramètre de type IDataRecord pour un maximum de compatibilité. Dans ma version, j'ai une surcharge qui prend un nombre, qui le fieldName version appels. Enregistre les "GetOrdinal", suivi par une recherche par nom.
Il y a une bonne mise en œuvre, qui peut faire face à tout type de valeur: rabdullin.com/journal/2008/12/6/...
Grâce Rinat, j'ai effectivement eu ce vers le bas à une seule méthode générique - voir stackoverflow.com/questions/303287
Toutes ces méthodes semblent être non-nécessaire car vous pouvez utiliser le
as
mot-clé pour obtenir une valeur à partir d'un lecteur permettant la valeur null. Si vous combinez le nul de la coalescence de??
opérateur avec l'opérateur, vous pouvez même avoir une valeur non nulle valeur par défaut pour aller directement à un type de valeur. Voir stackoverflow.com/questions/746767/...OriginalL'auteur
Il m'énervait que LINQ me donne une OrderBy qui prend une classe implémentant l'interface IComparer comme un argument, mais ne prend pas en charge le passage d'une simple anonyme comparer la fonction. J'ai rectifié.
Cette classe crée une IComparer de comparer votre fonction...
...et ces méthodes d'extension exposer mon nouveau OrderBy surcharges sur enumerables. Je doute que cela fonctionne pour LINQ to SQL, mais il est parfait pour LINQ to Objects.
Vous êtes les bienvenus pour mettre cela sur codeplex si vous le souhaitez.
OriginalL'auteur
C'est un MVC, il ajoute la possibilité de générer un
<label />
tag de laHtml
variable qui est disponible dans toutes lesViewPage
. J'espère que ce sera de l'utiliser pour d'autres cherchent à développer des extensions similaires.Utilisation:
De sortie:
Code:
C'est probablement ce qui doit être dupliqué avec Littérale à la place.
OriginalL'auteur
De transformer ceci:
... dans ce:
... à l'aide de cette méthode d'extension:
Plus ADO.NET les méthodes d'extension: DbExtensions
OriginalL'auteur