2009-05-28 7 views
5

Possible en double:
Post your extension goodies for C# .Net (codeplex.com/extensionoverflow)Existe-t-il une bibliothèque de méthodes d'extension pour C#? ou partager votre propre

Je suis friand de C# 3.0. Une de mes parties préférées est les méthodes d'extension. J'aime penser aux méthodes d'extension comme des fonctions d'utilité qui peuvent s'appliquer à une large base de classes. Je suis averti que cette question est subjective et susceptible d'être fermée, mais je pense que c'est une bonne question, parce que nous avons tous un code "statique" pour faire quelque chose de relativement statique comme "chaîne d'échappement pour XML" - mais je n'ai pas encore trouvé un endroit pour les recueillir. Je suis particulièrement intéressé par les fonctions courantes qui effectuent la journalisation/débogage/profilage, la manipulation de chaînes et l'accès à la base de données. Existe-t-il une bibliothèque de ces types de méthodes d'extension quelque part? Edit: déplacé mes exemples de code à une réponse. (Merci Joel pour avoir nettoyé le code!)

+0

S'il vous plaît poster la "réponse" une partie de votre question en guise de réponse. –

Répondre

6

Vous pourriez aimer MiscUtil.

En outre, beaucoup de gens comme celui-ci:

public static bool IsNullOrEmpty(this string s) 
{ 
    return s == null || s.Length == 0; 
} 

mais depuis 9 fois sur 10 ou plus je vérifie qu'il est pas nul ou vide, j'utilise ceci:

public static bool HasValue(this string s) 
{ 
    return s != null && s.Length > 0; 
} 

Enfin, un je pris tout récemment:

public static bool IsDefault<T>(this T val) 
{ 
    return EqualityComparer<T>.Default.Equals(val, default(T)); 
} 

Fonctionne pour vérifier les deux types de valeur comme DateTime, bool ou integer pour leurs valeurs par défaut, ou les types de référence comme string pour null. Cela fonctionne même sur un objet, ce qui est plutôt étrange.

+0

Ce n'est pas vraiment important, mais pourquoi ne pas simplement "renvoyer string.IsNullOrEmpty (s)"? –

+0

Vous pourriez le faire aussi. Pour une raison quelconque, je l'aime comme ça, mais j'ai vu les deux. –

+1

Et en fait, j'utilise personnellement quelque chose d'un peu différent, puisque 9 fois sur 10 je vérifie que ce n'est pas nul ou vide (a une valeur), le mien ressemble plus: public static bool HasValue (cette chaîne s) {return s! = null && s.Length> 0; } –

3

Voici quelques de mes:

// returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates) 
public static double UnixTicks(this DateTime dt) 
{ 
    DateTime d1 = new DateTime(1970, 1, 1); 
    DateTime d2 = dt.ToUniversalTime(); 
    TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); 
    return ts.TotalMilliseconds; 
} 

et une fonction ToDelimitedString:

// apply this extension to any generic IEnumerable object. 
public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> action) 
{ 
    if (source == null) 
    { 
     throw new ArgumentException("Source can not be null."); 
    } 

    if (delimiter == null) 
    { 
     throw new ArgumentException("Delimiter can not be null."); 
    } 

    string strAction = string.Empty; 
    string delim = string.Empty; 
    var sb = new StringBuilder(); 

    foreach (var item in source) 
    { 
     strAction = action.Invoke(item); 

     sb.Append(delim); 
     sb.Append(strAction); 
     delim = delimiter; 
    } 
    return sb.ToString(); 
} 
+0

Notez que mon nettoyage ne correspond pas exactement à votre comportement: vous n'avez pas ajouter quelque chose si strAction était vide, cela mettra toujours un élément vide là. –

+0

String.Join est plus approprié dans ce cas - je vais poster un exemple ici prochainement. –

+0

Exemple affiché. Je préfère utiliser les méthodes de bibliothèque lorsqu'elles sont disponibles, et je me suis dit que je montrerais un exemple. –

2

Voici la ToDelimitedString de Jeff écrit en utilisant String.Join:

public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> action) { 
    // guard clauses for arguments omitted for brevity 

    return String.Join(delimiter, source.Select(action)); 
} 
+0

Avez-vous vraiment besoin que ToArray soit appelé ici? Je pense qu'il est préférable de le laisser à la chaîne.Join qui ferait cela en interne – nawfal

+0

@nawfal - Vous avez raison - l'appel à '.ToArray' n'est pas nécessaire ici. Edité –

Questions connexes