¿Se pueden agregar extensiones estáticas a las clases en C #? No, pero puedes hacer esto:
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; }
}
Así es como funciona. Si bien técnicamente no puede escribir métodos de extensión estáticos, en su lugar, este código explota una laguna en los métodos de extensión. Esa laguna es que puede llamar a métodos de extensión en objetos nulos sin obtener la excepción nula (a menos que acceda a algo a través de @this).
Así que así es como usarías esto:
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(...)
Ahora, ¿POR QUÉ elegí llamar al constructor predeterminado como ejemplo y Y por qué no solo devuelvo el nuevo T () en el primer fragmento de código sin hacer toda esa basura Expression? Bueno, hoy es tu día de suerte porque obtienes un 2fer. Como cualquier desarrollador avanzado de .NET sabe, el nuevo T () es lento porque genera una llamada a System.Activator que utiliza la reflexión para obtener el constructor predeterminado antes de llamarlo. ¡Maldita sea Microsoft! Sin embargo, mi código llama al constructor predeterminado del objeto directamente.
Las extensiones estáticas serían mejores que esto, pero los tiempos desesperados requieren medidas desesperadas.