478 Stimmen

Was sind Ihre bevorzugten Erweiterungsmethoden für C#? (codeplex.com/extensionoverflow)

Lassen Sie uns eine Liste mit Antworten erstellen, in der Sie Ihre ausgezeichneten und bevorzugten Erweiterungsmethoden .

Die Anforderung ist, dass der vollständige Code mit einem Beispiel und einer Erklärung, wie er zu verwenden ist, veröffentlicht werden muss.

Aufgrund des großen Interesses an diesem Thema habe ich ein Open Source Projekt namens extensionoverflow auf Codeplex .

Bitte markieren Sie Ihre Antworten mit der Zustimmung, den Code in das Codeplex-Projekt zu stellen.

Bitte posten Sie den vollständigen Quellcode und nicht nur einen Link.

Codeplex Nachrichten:

24.08.2010 Die Codeplex-Seite ist jetzt hier: http://extensionoverflow.codeplex.com/

11.11.2008 XmlSerialize / XmlDeserialize ist jetzt Implementiert y Einheit getestet .

11.11.2008 Es gibt noch Platz für weitere Entwickler ;-) JETZT anmelden!

11.11.2008 Dritter Beitragszahler beigetreten ExtensionOverflow , willkommen bei BKristensen

11.11.2008 FormatWith ist jetzt Implementiert y Einheit getestet .

09.11.2008 Zweiter Beitragszahler beigetreten ExtensionOverflow . willkommen bei chakrit .

09.11.2008 Wir brauchen mehr Entwickler ;-)

09.11.2008 ThrowIfArgumentIsNull in jetzt Implementiert y Einheit getestet auf Codeplex.

58voto

stiduck Punkte 512

Die Erweiterungsmethode:

public static void AddRange<T, S>(this ICollection<T> list, params S[] values)
    where S : T
{
    foreach (S value in values)
        list.Add(value);
}

Die Methode gilt für alle Typen und ermöglicht es Ihnen, einer Liste eine Reihe von Elementen als Parameter hinzuzufügen.

Beispiel:

var list = new List<Int32>();
list.AddRange(5, 4, 8, 4, 2);

55voto

TWith2Sugars Punkte 3358

Stellen Sie dies auf jeden Fall in das Codeplex-Projekt.

Serialisierung / Deserialisierung von Objekten in XML:

/// <summary>Serializes an object of type T in to an xml string</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="obj">Object to serialize</param>
/// <returns>A string that represents Xml, empty otherwise</returns>
public static string XmlSerialize<T>(this T obj) where T : class, new()
{
    if (obj == null) throw new ArgumentNullException("obj");

    var serializer = new XmlSerializer(typeof(T));
    using (var writer = new StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }
}

/// <summary>Deserializes an xml string in to an object of Type T</summary>
/// <typeparam name="T">Any class type</typeparam>
/// <param name="xml">Xml as string to deserialize from</param>
/// <returns>A new object of type T is successful, null if failed</returns>
public static T XmlDeserialize<T>(this string xml) where T : class, new()
{
    if (xml == null) throw new ArgumentNullException("xml");

    var serializer = new XmlSerializer(typeof(T));
    using (var reader = new StringReader(xml))
    {
        try { return (T)serializer.Deserialize(reader); }
        catch { return null; } // Could not be deserialized to this type.
    }
}

46voto

chakrit Punkte 59834

ForEach für IEnumerables

public static class FrameworkExtensions
{
    // a map function
    public static void ForEach<T>(this IEnumerable<T> @enum, Action<T> mapFunction)
    {
        foreach (var item in @enum) mapFunction(item);
    }
}

Ein naives Beispiel:

var buttons = GetListOfButtons() as IEnumerable<Button>;

// click all buttons
buttons.ForEach(b => b.Click());

Tolles Beispiel:

// no need to type the same assignment 3 times, just
// new[] up an array and use foreach + lambda
// everything is properly inferred by csc :-)
new { itemA, itemB, itemC }
    .ForEach(item => {
        item.Number = 1;
        item.Str = "Hello World!";
    });

Anmerkung:

Dies ist nicht wie Select denn Select erwartet Ihre Funktion soll etwas zurückgeben, das in eine andere Liste umgewandelt werden kann.

Mit ForEach können Sie einfach für jedes der Elemente etwas ausführen, ohne dass eine Transformation/Datenmanipulation erforderlich ist.

Ich habe das gemacht, damit ich in einem funktionalen Stil programmieren kann, und ich war überrascht, dass List ein ForEach hat, während IEnumerable nicht hat.

Fügen Sie dies in das Codeplex-Projekt ein

43voto

TheSoftwareJedi Punkte 33452

Meine Umwandlung Erweiterungen, die Sie tun können:

int i = myString.To<int>();

Hier ist sie, wie auf TheSoftwareJedi.com veröffentlicht

public static T To<T>(this IConvertible obj)
{
  return (T)Convert.ChangeType(obj, typeof(T));
}

public static T ToOrDefault<T>
             (this IConvertible obj)
{
    try
    {
        return To<T>(obj);
    }
    catch
    {
        return default(T);
    }
}

public static bool ToOrDefault<T>
                    (this IConvertible obj,
                     out T newObj)
{
    try
    {
        newObj = To<T>(obj); 
        return true;
    }
    catch
    {
        newObj = default(T); 
        return false;
    }
}

public static T ToOrOther<T>
                       (this IConvertible obj,
                       T other)
{
  try
  {
      return To<T>obj);
  }
  catch
  {
      return other;
  }
}

public static bool ToOrOther<T>
                         (this IConvertible obj,
                         out T newObj,
                         T other)
{
    try
    {
        newObj = To<T>(obj);
        return true;
    }
    catch
    {
        newObj = other;
        return false;
    }
}

public static T ToOrNull<T>
                      (this IConvertible obj)
                      where T : class
{
    try
    {
        return To<T>(obj);
    }
    catch
    {
        return null;
    }
}

public static bool ToOrNull<T>
                  (this IConvertible obj,
                  out T newObj)
                  where T : class
{
    try
    {
        newObj = To<T>(obj);
        return true;
    }
    catch
    {
        newObj = null;
        return false;
    }
}

Sie können im Falle eines Fehlers nach dem Standardwert fragen (ruft den leeren Konstruktor oder "0" für numerische Werte auf), einen "Standard"-Wert angeben (ich nenne ihn "other") oder nach null fragen (mit T : class). Ich habe außerdem sowohl Modelle für stille Ausnahmen als auch ein typisches TryParse-Modell bereitgestellt, das ein bool zurückgibt, das die durchgeführte Aktion angibt, und ein out-Parameter enthält den neuen Wert. Unser Code kann also Dinge wie diese tun

int i = myString.To<int>();
string a = myInt.ToOrDefault<string>();
//note type inference
DateTime d = myString.ToOrOther(DateTime.MAX_VALUE);
double d;
//note type inference
bool didItGiveDefault = myString.ToOrDefault(out d);
string s = myDateTime.ToOrNull<string>();

Ich konnte nicht bekommen, Nullable Typen in die ganze Sache sehr sauber zu rollen. Ich habe es etwa 20 Minuten lang versucht, bevor ich das Handtuch geworfen habe.

43voto

Ich habe eine Erweiterungsmethode für die Protokollierung von Ausnahmen:

public static void Log(this Exception obj)
{
  //your logging logic here
}

Und es wird so verwendet:

try
{
    //Your stuff here
}
catch(Exception ex)
{
    ex.Log();
}

(Entschuldigung für den doppelten Beitrag; der 2. ist besser gestaltet :-))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X