C#でクラスに静的拡張機能を追加できますか?いいえ、あなたはこれを行うことができます:
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; }
}
これがどのように機能するかです。静的な拡張メソッドを技術的に書くことはできませんが、代わりにこのコードは拡張メソッドの抜け穴を利用します。その抜け穴は、@ thisを介して何かにアクセスしない限り、null例外を取得せずにnullオブジェクトの拡張メソッドを呼び出すことができることです。
したがって、これは次のように使用します。
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(...)
では、なぜデフォルトのコンストラクターを呼び出すことを例に選んだのか、そしてその式のガベージをすべて実行せずに、最初のコードスニペットでnew T()を返さないのはなぜですか?まあ今日はあなたが2ferを手に入れるのであなたの幸運な日です。高度な.NET開発者が知っているように、new T()は、リフレクションを使用してデフォルトコンストラクターを取得してから呼び出す前にSystem.Activatorへの呼び出しを生成するため、処理が遅くなります。くそーマイクロソフト!しかし、私のコードはオブジェクトのデフォルトのコンストラクターを直接呼び出します。
静的な拡張はこれよりも優れていますが、絶望的な時期には必死の対策が必要です。