क्या आप 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 के माध्यम से कुछ भी एक्सेस नहीं करते)।
तो यहां बताया गया है कि आप इसका उपयोग कैसे करेंगे:
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(...)
अब मैंने एक उदाहरण के रूप में डिफ़ॉल्ट कंस्ट्रक्टर को कॉल करने के लिए क्यों चुना, और क्यों मैं उस अभिव्यक्ति के कचरे को किए बिना पहले कोड स्निपेट में नया टी () वापस नहीं करता हूं? खैर आज आपका भाग्यशाली दिन है क्योंकि आपको एक 2fer मिलता है। जैसा कि किसी भी उन्नत .NET डेवलपर को पता है, नया T () धीमा है क्योंकि यह System.Activator पर कॉल उत्पन्न करता है जो कॉल करने से पहले डिफ़ॉल्ट कंस्ट्रक्टर को प्राप्त करने के लिए प्रतिबिंब का उपयोग करता है। लानत है आप Microsoft! हालाँकि मेरा कोड ऑब्जेक्ट के डिफॉल्ट कंस्ट्रक्टर को सीधे कॉल करता है।
स्टेटिक एक्सटेंशन इससे बेहतर होगा लेकिन हताश उपायों के लिए हताश बार कॉल करें।