আমি কি বিদ্যমান স্ট্যাটিক শ্রেণিতে এক্সটেনশন পদ্ধতি যুক্ত করতে পারি?


532

আমি সি # তে এক্সটেনশন পদ্ধতির একজন অনুরাগী, তবে কনসোলের মতো কোনও স্থির শ্রেণিতে এক্সটেনশন পদ্ধতি যুক্ত করতে কোনও সাফল্য পাইনি।

উদাহরণস্বরূপ, আমি যদি কনসোলে একটি এক্সটেনশন যুক্ত করতে চাই, যাকে 'WritBlueLine' বলা হয়, যাতে আমি যেতে পারি:

Console.WriteBlueLine("This text is blue");

আমি একটি স্থানীয়, পাবলিক স্ট্যাটিক পদ্ধতি যুক্ত করে কনসোলকে 'এই' প্যারামিটার হিসাবে যুক্ত করে চেষ্টা করেছি ... তবে কোনও পাশা নেই!

public static class Helpers {
    public static void WriteBlueLine(this Console c, string text)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine(text);
        Console.ResetColor();
    }
}

এটি কনসোলে কোনও 'রাইটব্লাইলাইন' পদ্ধতি যুক্ত করেনি ... আমি কি এটি ভুল করছি? নাকি অসম্ভবকে জিজ্ঞাসা করছেন?


3
আচ্ছা ভালো. দুর্ভাগ্যজনক তবে আমি মনে করি আমি পারব। আমি এখনও একটি এক্সটেনশন পদ্ধতি ভার্জিন (যাইহোক উত্পাদন কোডে)। আমি যদি ভাগ্যবান একদিন হতে পারি।
অ্যান্ডি ম্যাকক্লাগেজ

আমি ASP.NET MVC এর জন্য বেশ কয়েকটি এইচটিএমএল হেল্পার এক্সটেনশন লিখেছি। আমাকে প্রদত্ত তারিখের শেষের জন্য (23: 59.59) ডেটটাইমের জন্য একটি লিখেছেন। আপনি যখন ব্যবহারকারীকে একটি শেষের তারিখ নির্দিষ্ট করতে বলবেন তখন সহায়ক তবে সত্যই চান যে এটি সেই দিনের শেষ হোক।
tvanfosson

12
এগুলি যুক্ত করার কোনও উপায় নেই কারণ বৈশিষ্ট্যটি সি # তে বিদ্যমান নেই। প্রতি সেঞ্চে এটি অসম্ভব বলে নয় , তবে সি # পীপগুলি খুব ব্যস্ত থাকায়, বেশিরভাগই লিনিক্যু কাজ করতে এক্সটেনশন পদ্ধতিতে আগ্রহী ছিলেন এবং বাস্তবায়নে যে সময় লাগবে তার ন্যায্যতা প্রমাণ করার জন্য স্থির এক্সটেনশন পদ্ধতিগুলিতে যথেষ্ট সুবিধা দেখেনি। এরিক লিপার্ট এখানে ব্যাখ্যা করেছেন
জর্ডান গ্রে

1
শুধু কল করুন Helpers.WriteBlueLine(null, "Hi");:)
হেসেইন ইয়ালি

উত্তর:


285

না Ex তবে আপনি ConfigurationManagerইন্টারফেসের চারপাশে একটি স্থির মোড়ক লিখতে পারেন । আপনি যদি মোড়কে কার্যকর করেন তবে আপনার কেবল কোনও এক্সটেনশন পদ্ধতির দরকার নেই যেহেতু আপনি কেবল পদ্ধতিটি সরাসরি যুক্ত করতে পারেন।

 public static class ConfigurationManagerWrapper
 {
      public static ConfigurationSection GetSection( string name )
      {
         return ConfigurationManager.GetSection( name );
      }

      .....

      public static ConfigurationSection GetWidgetSection()
      {
          return GetSection( "widgets" );
      }
 }

8
@ লুইস - প্রসঙ্গে, ধারণাটি হবে "আমি কি একটি নির্দিষ্ট বিভাগ পাওয়ার জন্য কনফিগারেশন ম্যানেজার শ্রেণিতে একটি এক্সটেনশন পদ্ধতি যুক্ত করতে পারি?" আপনি কোনও স্ট্যাটিক ক্লাসে এক্সটেনশন পদ্ধতিটি যুক্ত করতে পারবেন না কারণ এটির জন্য বস্তুর উদাহরণের প্রয়োজন হয় তবে আপনি একটি মোড়কের ক্লাস (বা সম্মুখ) লিখতে পারেন যা একই স্বাক্ষরটি প্রয়োগ করে এবং আসল কলটি বাস্তব কনফিগারেশন ম্যানেজারে স্থগিত করে। আপনি র্যাপার ক্লাসে যা যা পদ্ধতি চান তা যুক্ত করতে পারেন তাই এটির এক্সটেনশন হওয়ার দরকার নেই।
tvanfosson

আমি কনফিগারেশনসেকশন প্রয়োগকারী ক্লাসে কেবল একটি স্থিতিশীল পদ্ধতি যুক্ত করা আরও সহায়ক বলে মনে করি। সুতরাং মাইকনফিগারেশনসেকশন নামে একটি বাস্তবায়ন দেওয়া হলে, আমি মাইকনফিগারেশনসেকশন.গেটসেকশন () কল করব, যা ইতিমধ্যে টাইপ করা বিভাগটি প্রদান করে বা এটি উপস্থিত না থাকলে শূন্য করে। শেষ ফলাফলটি একই, তবে এটি কোনও শ্রেণি যুক্ত করা এড়িয়ে যায়।
আলতো চাপুন

1
@ ট্যাপ - এটি কেবল একটি উদাহরণ এবং প্রথমটি যা মনে এসেছিল। যদিও একক দায়িত্বের নীতিটি কার্যকর হয়। "কনটেইনার" আসলে কনফিগারেশন ফাইল থেকে নিজেকে ব্যাখ্যা করার জন্য দায়বদ্ধ হওয়া উচিত? সাধারণত আমি সাধারণভাবে কনফিগারেশনসেকশনহ্যান্ডলারটি রেখে কনফিগারেশন ম্যানেজার থেকে উপযুক্ত শ্রেণিতে আউটপুট কাস্ট করি এবং মোড়কের সাথে বিরক্ত করব না।
tvanfosson

5
অভ্যন্তরীণ ব্যবহারের জন্য, আমি কাস্টম এক্সটেনশনগুলি যুক্ত করার জন্য স্ট্যাটিক ক্লাস এবং কাঠামোগুলির 'এক্স' ভেরিয়েন্ট তৈরি করতে শুরু করেছি: 'কনসোলএক্স'-এ' কনসোল 'এর জন্য নতুন স্ট্যাটিক পদ্ধতি রয়েছে,' ম্যাথএক্স'-এ 'ম্যাথ', 'কালারএক্স'এর জন্য নতুন স্ট্যাটিক পদ্ধতি রয়েছে 'রঙ' পদ্ধতিগুলি প্রসারিত করে ইত্যাদি এক রকম নয়, তবে ইন্টেলিজেন্সে মনে রাখা এবং আবিষ্কার করা সহজ।
ব্যবহারকারী1689175

1
@ এক্সট্রো আমি সম্মত হই যে এটি ভয়াবহ, তবে এটির জায়গায় দ্বিগুণ পরীক্ষা ব্যবহার করতে না পারার চেয়ে খারাপ বা আরও খারাপ, আপনার কোড পরীক্ষা করা ছেড়ে দেওয়া কারণ স্থির শ্রেণিগুলি এটিকে এত কঠিন করে তোলে। মাইক্রোসফ্ট আমার সাথে একমত বলে মনে হচ্ছে কারণ এটি এমভিসির জন্য স্থির এইচটিটিপি কনটেক্সট.কমেরের কাছাকাছি পেতে এইচটিটিপি কনটেক্সটওয়্যার্পার / এইচটিটিপি কনটেক্সটবেস ক্লাস চালু করেছিল।
tvanfosson

91

আপনি কি সি # তে ক্লাসে স্থির এক্সটেনশন যুক্ত করতে পারেন? না তবে আপনি এটি করতে পারেন:

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 অ্যাক্টিভেটর যা কল করার আগে এটি ডিফল্ট নির্মাতাকে পাওয়ার জন্য প্রতিচ্ছবি ব্যবহার করে। মাইক্রোসফ্ট! তবে আমার কোডটি সরাসরি অবজেক্টের ডিফল্ট কনস্ট্রাক্টরকে কল করে।

স্ট্যাটিক এক্সটেনশনগুলি এর চেয়ে ভাল হবে তবে মরিয়া সময়গুলি হতাশ ব্যবস্থার জন্য ডাকে।


2
আমি মনে করি ডেটাসেটের জন্য এই কৌশলটি কাজ করবে তবে আমি সন্দেহ করি যে এটি কনসোল শ্রেণির জন্য কাজ করে কারণ কনসোল স্থির শ্রেণি, স্থির ধরণের যুক্তি হিসাবে ব্যবহার করা যায় না :)
থমাসবেকার

হ্যাঁ, আমিও একই কথা বলতে যাচ্ছিলাম। এটি একটি অ স্থিত শ্রেণীর সিউডো-স্ট্যাটিক এক্সটেনশন পদ্ধতি। ওপি হ'ল স্থিতিশীল শ্রেণিতে একটি এক্সটেনশন পদ্ধতি।
মার্ক এ। ডোনোহো

2
এটা অনেক ঠিক ধরনের পদ্ধতি জন্য কিছু নামকরণ কনভেনশন আছে ভাল এবং সহজ XConsole, ConsoleHelperইত্যাদি।
অ্যালেক্স

9
এটি একটি আকর্ষণীয় কৌশল, কিন্তু ফলাফল গন্ধযুক্ত sme আপনি একটি নাল বস্তু তৈরি করেন, তারপরে এটিতে কোনও পদ্ধতিতে কল করতে হাজির হন - বহু বছর ধরে বলা হচ্ছে যে "নাল বস্তুর উপর কোনও পদ্ধতি কল করা ব্যতিক্রম ঘটায়"। এটি কাজ করে, তবে .. বা ... পরে রক্ষণাবেক্ষণ করা কারও পক্ষে বিভ্রান্তি। আমি কমে যাব না, কারণ আপনি যা সম্ভব তা তথ্যের পুলটিতে যুক্ত করেছেন। তবে আমি আন্তরিকভাবে আশা করি কেউ কখনও এই কৌশলটি ব্যবহার করেন না !! অতিরিক্ত অভিযোগ: একটি পদ্ধতি এই এক পাস না এবং OO যেমন পণ্য subclassing পাওয়ার আশা: পদ্ধতি ধরণ হতে হবে নামক প্যারামিটার ঘোষণা এর টাইপ না প্যারামিটার পাস
টুলমেকারস্টেভ

5
এটি মুশকিল, তবে আমি এটি পছন্দ করি। একটি বিকল্প (null as DataSet).Create();হতে পারে default(DataSet).Create();
বাগেরফাহার

54

এটা সম্ভব না.

এবং হ্যাঁ আমি মনে করি এমএস এখানে একটি ভুল করেছে।

তাদের সিদ্ধান্তটি কোনও অর্থবোধ করে না এবং প্রোগ্রামারদের একটি অর্থহীন মোড়কের ক্লাসটি লিখতে বাধ্য করে (উপরে বর্ণিত হিসাবে)।

এখানে একটি ভাল উদাহরণ: স্থিতিশীল এমএস ইউনিট পরীক্ষার শ্রেণি প্রসারিত করার চেষ্টা করা হচ্ছে: আমি আরও 1 টি চাপানো পদ্ধতি চাই AreEqual(x1,x2)

এটি করার একমাত্র উপায় হ'ল বিভিন্ন ক্লাসের দিকে নির্দেশ করা বা বিভিন্ন আসর্ট পদ্ধতিগুলির প্রায় 100 এর কাছাকাছি একটি র‌্যাপার লেখা। কেন !?

উদাহরণগুলির বর্ধনের অনুমতি দেওয়ার সিদ্ধান্ত নেওয়া হলে আমি স্থির এক্সটেনশানগুলিকে অনুমতি না দেওয়ার কোনও যৌক্তিক কারণ দেখতে পাচ্ছি না। দৃষ্টান্তগুলি প্রসারিত করার পরে লাইব্রেরিগুলি বিভাগ করার বিষয়ে যুক্তিগুলি উঠে দাঁড়ায় না।


20
আমি এমএস ইউনিট টেস্ট ক্লাস এ্যাসেটটি প্রসারিত করার চেষ্টাও করছিলাম আসরটি যোগ করুন.আমার চেষ্টা করুন এবং Assert.DoesNotTro এবং একই সমস্যার মুখোমুখি হলাম।
স্টেফানো রিকার্দি

3
হ্যা আমিও :( আমি ভেবেছিলাম আমি কি করতে পারি Assert.Throwsউত্তর stackoverflow.com/questions/113395/...
CallMeLaNN

27

ওপি যে একই প্রশ্নের উত্তর পেয়েছিল তার উত্তর খুঁজতে গিয়ে আমি এই থ্রেডে হোঁচট খেয়েছি। আমি যে উত্তর চেয়েছিলাম তা পাইনি তবে আমি এটি শেষ করেছিলাম।

public static class MyConsole
{
    public static void WriteLine(this ConsoleColor Color, string Text)
    {
        Console.ForegroundColor = Color;
        Console.WriteLine(Text);   
    }
}

এবং আমি এটি এর মতো ব্যবহার করি:

ConsoleColor.Cyan.WriteLine("voilà");

19

হতে পারে আপনি নিজের কাস্টম নেমস্পেস এবং একই শ্রেণীর নাম সহ একটি স্ট্যাটিক ক্লাস যুক্ত করতে পারেন:

using CLRConsole = System.Console;

namespace ExtensionMethodsDemo
{
    public static class Console
    {
        public static void WriteLine(string value)
        {
            CLRConsole.WriteLine(value);
        }

        public static void WriteBlueLine(string value)
        {
            System.ConsoleColor currentColor = CLRConsole.ForegroundColor;

            CLRConsole.ForegroundColor = System.ConsoleColor.Blue;
            CLRConsole.WriteLine(value);

            CLRConsole.ForegroundColor = currentColor;
        }

        public static System.ConsoleKeyInfo ReadKey(bool intercept)
        {
            return CLRConsole.ReadKey(intercept);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteBlueLine("This text is blue");   
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
        }
    }
}

1
তবে এটি আপনার মোড়কে রাখতে চান এমন মূল স্ট্যাটিক শ্রেণি থেকে প্রতিটি পদ্ধতির পুনরায় সংবিধানের প্রয়োজনের সমস্যার সমাধান করে না । এটি এখনও একটি মোড়ক, যদিও এটি কোড ব্যবহার করে এমন
কোডগুলিতে


11

নাঃ। এক্সটেনশন পদ্ধতির সংজ্ঞাগুলির জন্য আপনি যে ধরণের প্রসারিত করছেন তার উদাহরণ প্রয়োজন। এটি দুর্ভাগ্যজনক; আমি নিশ্চিত না কেন এটির প্রয়োজনীয়তা ...


4
কারণ কোনও এক্সটেনশন পদ্ধতি কোনও অবজেক্টের উদাহরণ বাড়ানোর জন্য ব্যবহৃত হয়। যদি তারা এটি না করে তবে তারা কেবল নিয়মিত স্থির পদ্ধতি হবে।
ডেরেক একিনস

31
দুটোই করেই ভালো লাগবে, তাই না?

7

এক্সটেনশন পদ্ধতি হিসাবে, এক্সটেনশন পদ্ধতিগুলি এগুলি স্থির; তবে সেগুলিকে অনুরোধ করা হয়েছে যেন তারা উদাহরণ পদ্ধতি। যেহেতু একটি স্ট্যাটিক শ্রেণি তাত্ক্ষণিকভাবে নয়, আপনার কাছে ক্লাসের কোনও উদাহরণ কখনই থেকে কোনও এক্সটেনশান পদ্ধতিটি চাওয়া হবে না। এই কারণে সংকলক স্থির শ্রেণীর জন্য এক্সটেনশন পদ্ধতিগুলি সংজ্ঞায়িত করতে দেয় না।

মিঃ অবনজিয়াস লিখেছেন: "যে কোনও উন্নত। নেট বিকাশকারী জানেন, নতুন টি () ধীর গতির কারণ এটি সিস্টেমকে কল দেয় c অ্যাক্টিভেটর যা কল করার আগে এটি ডিফল্ট নির্মাণকারীকে পেতে প্রতিচ্ছবি ব্যবহার করে"।

সংকলন সময়ে টাইপটি জানা থাকলে নতুন () IL "newobj" নির্দেশনায় সংকলিত হয়। নেভোবজ সরাসরি ডাকে একটি কনস্ট্রাক্টর নেন takes সিস্টেম.এ্যাকটিভেটর। জেনেরিক ধরণের বিপরীতে ব্যবহৃত হলে নতুন () এর ফলস্বরূপ System.Activator.CreateInstance () এ কল করা হবে। মিঃ ওবোনাক্সিয়াসের পোস্টটি এই বিষয়ে অস্পষ্ট ছিল ... এবং ভাল, অসদাচীন।

এই কোড:

System.Collections.ArrayList _al = new System.Collections.ArrayList();
System.Collections.ArrayList _al2 = (System.Collections.ArrayList)System.Activator.CreateInstance(typeof(System.Collections.ArrayList));

এই আইএল উত্পাদন করে:

  .locals init ([0] class [mscorlib]System.Collections.ArrayList _al,
           [1] class [mscorlib]System.Collections.ArrayList _al2)
  IL_0001:  newobj     instance void [mscorlib]System.Collections.ArrayList::.ctor()
  IL_0006:  stloc.0
  IL_0007:  ldtoken    [mscorlib]System.Collections.ArrayList
  IL_000c:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
  IL_0011:  call       object [mscorlib]System.Activator::CreateInstance(class [mscorlib]System.Type)
  IL_0016:  castclass  [mscorlib]System.Collections.ArrayList
  IL_001b:  stloc.1

5

আপনি কোনও ধরণের স্থির পদ্ধতি যুক্ত করতে পারবেন না । আপনি কেবল (সিডো-) উদাহরণের পদ্ধতিতে কোনও ধরণের উদাহরণে যুক্ত করতে পারেন।

thisসংশোধকটির বিন্দুটি সি # কম্পাইলারকে .স্ট্যাটিক / এক্সটেনশন পদ্ধতির প্রথম প্যারামিটার হিসাবে বাম-পাশের উদাহরণটি পাস করতে বলা হয় ।

কোনও ধরণের স্থিতিশীল পদ্ধতি যুক্ত করার ক্ষেত্রে প্রথম প্যারামিটারটি পাস করার কোনও নজির নেই।


4

আমি সিস্টেমের সাথে এটি করার চেষ্টা করেছি n পরিবেশ যখন ফিরে যখন আমি এক্সটেনশন পদ্ধতিগুলি শিখছিলাম এবং সফল ছিলাম না তখন। কারণগুলি, যেমন অন্যরা উল্লেখ করেছেন, কারণ এক্সটেনশন পদ্ধতিগুলির জন্য শ্রেণীর একটি উদাহরণ প্রয়োজন।


3

এক্সটেনশন পদ্ধতিটি লেখা সম্ভব নয়, তবে আপনি যে আচরণটির জন্য জিজ্ঞাসা করছেন তা নকল করা সম্ভব।

using FooConsole = System.Console;

public static class Console
{
    public static void WriteBlueLine(string text)
    {
        FooConsole.ForegroundColor = ConsoleColor.Blue;
        FooConsole.WriteLine(text);
        FooConsole.ResetColor();
    }
}

এটি আপনাকে অন্যান্য ক্লাসে কনসোল.উরাইট ব্লুলাইন (fooText) কল করার অনুমতি দেবে। অন্যান্য শ্রেণিগুলি যদি কনসোলের অন্যান্য স্থিতিশীল ফাংশনগুলিতে অ্যাক্সেস চায় তবে তাদের নাম স্থানের মাধ্যমে তাদের স্পষ্টভাবে উল্লেখ করতে হবে।

আপনি যদি সবগুলি এক জায়গায় রাখতে চান তবে আপনি সর্বদা প্রতিস্থাপন শ্রেণিতে সমস্ত পদ্ধতি যুক্ত করতে পারেন।

সুতরাং আপনার মত কিছু হবে

using FooConsole = System.Console;

public static class Console
{
    public static void WriteBlueLine(string text)
    {
        FooConsole.ForegroundColor = ConsoleColor.Blue;
        FooConsole.WriteLine(text);
        FooConsole.ResetColor();
    }
    public static void WriteLine(string text)
    {
        FooConsole.WriteLine(text);
    }
...etc.
}

এটি আপনি যে ধরণের আচরণের সন্ধান করছেন তা প্রদান করবে।

* নোট কনসোলটি আপনি যে নেমস্পেসে রেখেছিলেন তা দিয়ে যোগ করতে হবে।


1

হ্যাঁ, সীমিত অর্থে

public class DataSet : System.Data.DataSet
{
    public static void SpecialMethod() { }
}

এটি কাজ করে তবে কনসোলটি স্থির না হওয়ায় তা নয়।

public static class Console
{       
    public static void WriteLine(String x)
    { System.Console.WriteLine(x); }

    public static void WriteBlueLine(String x)
    {
        System.Console.ForegroundColor = ConsoleColor.Blue;
        System.Console.Write(.x);           
    }
}

এটি কাজ করে কারণ যতক্ষণ না এটি একই নেমস্পেসে না থাকে। সমস্যাটি হ'ল সিস্টেম.কনসোলের প্রতিটি পদ্ধতির জন্য আপনাকে একটি প্রক্সি স্ট্যাটিক পদ্ধতি লিখতে হবে। আপনি এটির মতো কিছু যুক্ত করতে পারেন এটি অগত্যা কোনও খারাপ জিনিস নয়:

    public static void WriteLine(String x)
    { System.Console.WriteLine(x.Replace("Fck","****")); }

অথবা

 public static void WriteLine(String x)
    {
        System.Console.ForegroundColor = ConsoleColor.Blue;
        System.Console.WriteLine(x); 
    }

এটি যেভাবে কাজ করে তা হ'ল আপনি স্ট্যান্ডার্ড রাইটলাইনে কিছু হুক করুন। এটি একটি লাইন গণনা বা খারাপ শব্দ ফিল্টার বা যা কিছু হতে পারে। আপনি যখনই নিজের নামস্থানে কনসোলকে কেবল ওয়েবপ্রোজেক্ট 1 বলুন এবং নামস্থান সিস্টেমটি আমদানি করবেন তখনই ওয়েবপ্রোজেক্ট 1. কনসোলকে সিস্টেমের উপর থেকে বেছে নেওয়া হবে name সুতরাং এই কোডটি সমস্ত কনসোল.উরাইটলাইন কলগুলিকে নীল ইনসোফারে পরিণত করবে কারণ আপনি কখনও সিস্টেম.কনসোল.ওরাইটলাইন নির্দিষ্ট করেননি।


দুর্ভাগ্যক্রমে যখন বর্গ শ্রেণিটি সিল করা হয় তখন বংশধরকে ব্যবহার করার পদ্ধতির কাজ হয় না (। নেট ক্লাসের লাইব্রেরিতে অনেকের মতো)
জর্জ বীরবিলিস

1

নিম্নলিখিত একটি হিসাবে প্রত্যাখ্যাত হয়েছিল সম্পাদন করা tvanfosson এর উত্তর দিতে। আমাকে আমার নিজের উত্তর হিসাবে এটি অবদান রাখতে বলা হয়েছিল। আমি তার পরামর্শটি ব্যবহার করেছি এবং একটি ConfigurationManagerমোড়কের বাস্তবায়ন শেষ করেছি । নীতিগতভাবে আমি সহজভাবে ...ট্যাভনফসনের উত্তরটি পূরণ করেছি।

না। এক্সটেনশন পদ্ধতিগুলির জন্য কোনও অবজেক্টের উদাহরণ প্রয়োজন। তবে, আপনি কনফিগারেশন ম্যানেজার ইন্টারফেসের চারপাশে একটি স্থির মোড়ক লিখতে পারেন। আপনি যদি মোড়কে কার্যকর করেন তবে আপনার কেবল কোনও এক্সটেনশন পদ্ধতির দরকার নেই যেহেতু আপনি কেবল পদ্ধতিটি সরাসরি যুক্ত করতে পারেন।

public static class ConfigurationManagerWrapper
{
    public static NameValueCollection AppSettings
    {
        get { return ConfigurationManager.AppSettings; }
    }

    public static ConnectionStringSettingsCollection ConnectionStrings
    {
        get { return ConfigurationManager.ConnectionStrings; }
    }

    public static object GetSection(string sectionName)
    {
        return ConfigurationManager.GetSection(sectionName);
    }

    public static Configuration OpenExeConfiguration(string exePath)
    {
        return ConfigurationManager.OpenExeConfiguration(exePath);
    }

    public static Configuration OpenMachineConfiguration()
    {
        return ConfigurationManager.OpenMachineConfiguration();
    }

    public static Configuration OpenMappedExeConfiguration(ExeConfigurationFileMap fileMap, ConfigurationUserLevel userLevel)
    {
        return ConfigurationManager.OpenMappedExeConfiguration(fileMap, userLevel);
    }

    public static Configuration OpenMappedMachineConfiguration(ConfigurationFileMap fileMap)
    {
        return ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
    }

    public static void RefreshSection(string sectionName)
    {
        ConfigurationManager.RefreshSection(sectionName);
    }
}

0

এটিকে কাজ করতে আপনি নালার উপরে একটি কাস্ট ব্যবহার করতে পারেন।

public static class YoutTypeExtensionExample
{
    public static void Example()
    {
        ((YourType)null).ExtensionMethod();
    }
}

প্রসার:

public static class YourTypeExtension
{
    public static void ExtensionMethod(this YourType x) { }
}

YourType:

public class YourType { }

-4

আপনি যদি স্ট্যাটিক ক্লাসের একটি ভেরিয়েবল তৈরি করে এবং এটিকে শূন্য করার জন্য কিছুটা "ফ্রিগ" করতে ইচ্ছুক হন তবে আপনি এটি করতে পারেন। তবে এই পদ্ধতিটি ক্লাসে স্থির কলগুলিতে উপলব্ধ হবে না, সুতরাং এটি কতটা ব্যবহার করবে তা নিশ্চিত নয়:

Console myConsole = null;
myConsole.WriteBlueLine("my blue line");

public static class Helpers {
    public static void WriteBlueLine(this Console c, string text)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine(text);
        Console.ResetColor();
    }
}

আমি ঠিক তাই করেছি। আমার ক্লাসের MyTrace বলা হয় :)
Gishu

দরকারী টিপস। একটি কোড গন্ধ বিট, কিন্তু আমি অনুমান করি আমরা একটি বেস ক্লাস বা কিছুতে নাল বস্তুটি লুকিয়ে রাখতে পারি। ধন্যবাদ।
টম ডিলফোর্ড

1
আমি এই কোডটি সংকলন করতে পারি না। ত্রুটি 'সিস্টেম.কনসোল': স্থির
ধরণগুলি

হ্যাঁ এটি করা যায় না। অভিশাপ আমি ভেবেছিলাম আপনি সেখানে কিছু ছিল! স্থিতিশীল ধরণেরগুলিকে এমন পদ্ধতিগুলিতে পরামিতি হিসাবে পাস করা যায় না যা আমার ধারণা অনুভূত হয়। আসুন আমরা আশা করি যে এমএস গাছের গাছগুলি থেকে কাঠটি দেখে এবং এটি পরিবর্তন করে।
টম ডিলফোর্ড

3
আমার নিজের কোডটি সংকলনের চেষ্টা করা উচিত ছিল! টম যেমন বলেছেন, এটি স্ট্যাটিক ক্লাসগুলির সাথে কাজ করবে না।
টেনাকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.