Können Sie statische Erweiterungen zu Klassen in C# hinzufügen? Nein, aber Sie können dies tun:
public static class Extensions
{
public static T Create<T>(this T @this)
where T : class, new()
{
return Utility<T>.Create();
}
}
public static class Utility<T>
where T : class, new()
{
static Utility()
{
Create = Expression.Lambda<Func<T>>(Expression.New(typeof(T).GetConstructor(Type.EmptyTypes))).Compile();
}
public static Func<T> Create { get; private set; }
}
Und so funktioniert es. Während man technisch gesehen keine statischen Erweiterungsmethoden schreiben kann, nutzt dieser Code stattdessen eine Lücke in den Erweiterungsmethoden aus. Dieses Schlupfloch besteht darin, dass Sie Erweiterungsmethoden für Null-Objekte aufrufen können, ohne die Null-Ausnahme zu erhalten (es sei denn, Sie greifen über @this auf etwas zu).
So würden Sie dies also verwenden:
var ds1 = (null as DataSet).Create(); // as oppose to DataSet.Create()
// or
DataSet ds2 = null;
ds2 = ds2.Create();
// using some of the techniques above you could have this:
(null as Console).WriteBlueLine(...); // as oppose to Console.WriteBlueLine(...)
Warum habe ich nun den Aufruf des Standardkonstruktors als Beispiel gewählt, und warum gebe ich im ersten Codeschnipsel nicht einfach new T() zurück, ohne den ganzen Expression-Müll zu machen? Nun, heute ist Ihr Glückstag, denn Sie bekommen einen 2fer. Wie jeder fortgeschrittene .NET-Entwickler weiß, ist new T() langsam, weil es einen Aufruf an System.Activator generiert, der Reflection verwendet, um den Standardkonstruktor zu erhalten, bevor er ihn aufruft. Verdammt seist du Microsoft! Mein Code ruft jedoch den Standardkonstruktor des Objekts direkt auf.
Statische Verlängerungen wären besser als diese, aber verzweifelte Zeiten erfordern verzweifelte Maßnahmen.
3 Stimmen
O
0 Stimmen
I
14 Stimmen
T p , E .