আপনি কি সি # তে ক্লাসে স্থির এক্সটেনশন যুক্ত করতে পারেন? না তবে আপনি এটি করতে পারেন:
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; }
}
এখানে কিভাবে এটা কাজ করে. আপনি প্রযুক্তিগতভাবে স্থিতিশীল এক্সটেনশন পদ্ধতিগুলি লিখতে পারবেন না, পরিবর্তে এই কোডটি এক্সটেনশন পদ্ধতিতে একটি ফাঁকটি শোষণ করে। এই ফাঁকটি হ'ল আপনি নাল ব্যতিক্রম না পেয়ে নাল বস্তুগুলিতে এক্সটেনশন পদ্ধতিগুলি কল করতে পারবেন (যদি আপনি @ এই মাধ্যমে কোনও কিছু অ্যাক্সেস না করেন)।
সুতরাং আপনি এখানে এটি কীভাবে ব্যবহার করবেন:
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 পান fer যে কোনও উন্নত। নেট বিকাশকারী জানেন, নতুন টি () ধীর গতির কারণ এটি সিস্টেমে একটি কল উত্পন্ন করে c অ্যাক্টিভেটর যা কল করার আগে এটি ডিফল্ট নির্মাতাকে পাওয়ার জন্য প্রতিচ্ছবি ব্যবহার করে। মাইক্রোসফ্ট! তবে আমার কোডটি সরাসরি অবজেক্টের ডিফল্ট কনস্ট্রাক্টরকে কল করে।
স্ট্যাটিক এক্সটেনশনগুলি এর চেয়ে ভাল হবে তবে মরিয়া সময়গুলি হতাশ ব্যবস্থার জন্য ডাকে।