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.

2voto

Kaveh Shahbazian Punkte 12331

Ich habe ein Paket von Erweiterungsmethoden implementiert (verfügbar unter http://foop.codeplex.com/ ) und einige der von mir täglich genutzten sind:

// the most beloved extension method for me is Pipe:
<%= variable.Pipe(x => this.SomeFunction(x)).Pipe(y =>
{
    ...;
    return this.SomeOtherFunction(y);
}) %>

var d = 28.December(2009); // some extension methods for creating DateTime
DateTime justDatePart = d.JustDate();
TimeSpan justTimePart = d.JustTime();
var nextTime = d.Add(5.Hours());

using(StreamReader reader = new StreamReader("lines-of-data-file-for-example")) {
    ...
    // for reading streams line by line and usable in LINQ
    var query = from line in reader.Lines(); 
                where line.Contains(_today)
                select new { Parts = PartsOf(line), Time = _now };
}

500.Sleep();

XmlSerialize and XmlDeserialize

IsNull and IsNotNull

IfTrue, IfFalse and Iff:
true.IfTrue(() => Console.WriteLine("it is true then!");

IfNull and IfNotNull

2voto

cbp Punkte 24483

Ich mag diese Methoden für den Umgang mit Enums, die das Attribut Flags gesetzt haben:

public static bool AnyOf(this object mask, object flags)
{
    return ((int)mask & (int)flags) != 0;
}
public static bool AllOf(this object mask, object flags)
{
    return ((int)mask & (int)flags) == (int)flags;
}
public static object SetOn(this object mask, object flags)
{
    return (int)mask | (int)flags;
}
etc.

Beispiel für die Verwendung:

var options = SomeOptions.OptionA;
options = options.SetOn(OptionB);
options = options.SetOn(OptionC);

if (options.AnyOf(SomeOptions.OptionA | SomeOptions.OptionB))
{
etc.

Die ursprünglichen Methoden stammen aus diesem Artikel: http://www.codeproject.com/KB/cs/masksandflags.aspx?display=Print Ich habe sie einfach in Erweiterungsmethoden umgewandelt.

Das einzige Problem dabei ist, dass die Parameter vom Typ Objekt sind, was bedeutet, dass tous Objekte werden schließlich um diese Methoden erweitert, obwohl sie idealerweise nur für Enums gelten sollten.

Update Wie in den Kommentaren erwähnt, können Sie die "Signaturverschmutzung" auf Kosten der Leistung wie folgt umgehen:

public static bool AnyOf(this Enum mask, object flags)
{
    return (Convert.ToInt642(mask) & (int)flags) != 0;
}

2voto

terjetyl Punkte 9247

Diese Erweiterungsmethoden sind für mich sehr nützlich, wenn ich Formulareingaben analysiere, bevor sie in die Datenbank eingegeben werden

public static int? ToInt(this string input) 
{
    int val;
    if (int.TryParse(input, out val))
        return val;
    return null;
}

public static DateTime? ToDate(this string input)
{
    DateTime val;
    if (DateTime.TryParse(input, out val))
        return val;
    return null;
}

public static decimal? ToDecimal(this string input)
{
    decimal val;
    if (decimal.TryParse(input, out val))
        return val;
    return null;
}

2voto

lubos hasko Punkte 24316

Ich benutze diesen hier ziemlich oft...

Ursprünglicher Code:

if (guid != Guid.Empty) return guid;
else return Guid.NewGuid();

Neuer Code:

return guid.NewGuidIfEmpty();

Methode der Erweiterung:

public static Guid NewGuidIfEmpty(this Guid uuid)
{
    return (uuid != Guid.Empty ? uuid : Guid.NewGuid());
}

1voto

Dan Diplo Punkte 24765

In ASP.NET habe ich immer die Nase voll davon, FindControl zu verwenden und dann prüfen zu müssen, ob der Wert null ist, bevor ich ihn referenziere. Deshalb habe ich eine TryParse()-Methode zu Kontrolle die die ähnlichen im Framework für Int32 usw. widerspiegelt.

public static bool TryParse<T>(this Control control, string id, out T result) 
    where T : Control
{
    result = control.FindControl(id) as T;
    return result != null;
}

Jetzt können Sie dies in ASP.NET-Webformularseiten tun:

Label lbl;
if (Page.TryParse("Label1", out lbl))
{
    lbl.Text = "Safely set text";
}

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