Bisakah Anda menambahkan ekstensi statis ke kelas di C #? Tidak, tetapi Anda bisa melakukan ini:
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; }
}
Begini cara kerjanya. Meskipun Anda tidak dapat secara teknis menulis metode ekstensi statis, alih-alih kode ini mengeksploitasi celah dalam metode ekstensi. Celah itu adalah Anda dapat memanggil metode ekstensi pada objek nol tanpa mendapatkan pengecualian nol (kecuali Anda mengakses apa pun melalui @ ini).
Jadi, inilah cara Anda menggunakan ini:
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(...)
Sekarang MENGAPA saya memilih memanggil konstruktor default sebagai contoh, dan DAN mengapa saya tidak mengembalikan T () baru dalam cuplikan kode pertama tanpa melakukan semua sampah Ekspresi? Baiklah hari ini hari keberuntunganmu karena kamu mendapatkan 2fer. Seperti diketahui oleh setiap pengembang .NET canggih, T () baru lambat karena menghasilkan panggilan ke System.Activator yang menggunakan refleksi untuk mendapatkan konstruktor default sebelum memanggilnya. Sialan kau, Microsoft! Namun kode saya memanggil konstruktor default objek secara langsung.
Ekstensi statis akan lebih baik dari ini, tetapi saat-saat putus asa membutuhkan tindakan putus asa.