Você pode adicionar extensões estáticas às classes em c #? Não, mas você pode fazer isso:
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; }
}
Aqui está como isso funciona. Embora você não possa tecnicamente escrever métodos de extensão estáticos, esse código explora uma brecha nos métodos de extensão. Essa brecha é que você pode chamar métodos de extensão em objetos nulos sem obter a exceção nula (a menos que você acesse algo via @this).
Então, aqui está como você usaria isso:
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(...)
Agora, por que escolhi chamar o construtor padrão como exemplo e AND por que não retornei o novo T () no primeiro trecho de código sem fazer todo esse lixo de expressão? Bem, hoje é seu dia de sorte, porque você recebe um 2fer. Como qualquer desenvolvedor .NET avançado sabe, o novo T () é lento porque gera uma chamada para System.Activator que usa reflexão para obter o construtor padrão antes de chamá-lo. Maldito seja, Microsoft! No entanto, meu código chama o construtor padrão do objeto diretamente.
Extensões estáticas seriam melhores do que isso, mas tempos desesperados exigem medidas desesperadas.