क्या मैं मौजूदा स्थिर वर्ग में एक्सटेंशन विधियाँ जोड़ सकता हूँ?


532

मैं C # में एक्सटेंशन विधियों का प्रशंसक हूं, लेकिन किसी भी एक्सटेंशन विधि को स्थिर वर्ग, जैसे कंसोल में जोड़ने में कोई सफलता नहीं मिली है।

उदाहरण के लिए, यदि मैं 'WriteBlueLine' नामक कंसोल में एक्सटेंशन जोड़ना चाहता हूं, ताकि मैं जा सकूं:

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();
    }
}

यह कंसोल में एक 'WriteBlueLine' विधि नहीं जोड़ा गया ... क्या मैं इसे गलत कर रहा हूं? या असंभव के लिए पूछ रहे हैं?


3
ओह अच्छा। दुर्भाग्यपूर्ण है, लेकिन मुझे लगता है कि मैं करूँगा। मैं अभी भी एक विस्तार विधि कुंवारी हूँ (वैसे भी उत्पादन कोड में)। शायद एक दिन, अगर मैं भाग्यशाली हूं।
एंडी मैकक्लोडेज

मैंने ASP.NET MVC के लिए कई HtmlHelper एक्सटेंशन लिखे हैं। डेटटाइम के लिए मुझे दी गई तारीख (23: 59.59) का अंत करने के लिए एक लिखा। सहायक जब आप उपयोगकर्ता को अंतिम तिथि निर्दिष्ट करने के लिए कहते हैं, लेकिन वास्तव में यह चाहते हैं कि यह उस दिन का अंत हो।
तवान्फोसन

12
वर्तमान में उन्हें जोड़ने का कोई तरीका नहीं है क्योंकि यह सुविधा C # में मौजूद नहीं है। इसलिए नहीं कि यह असंभव है , लेकिन क्योंकि सी # पीप बहुत व्यस्त हैं, ज्यादातर LINQ काम करने के लिए विस्तार के तरीकों में रुचि रखते थे और स्थैतिक विस्तार के तरीकों में पर्याप्त लाभ नहीं दिखाते थे ताकि वे लागू होने में लगने वाले समय को सही ठहरा सकें। एरिक लिपर्ट यहां बताते हैं
जॉर्डन ग्रे

1
बस Helpers.WriteBlueLine(null, "Hi");:)
Hüseyin Yağlı

जवाबों:


285

एक्सटेंशन एक्सटेंशन विधियों में किसी ऑब्जेक्ट के लिए एक इंस्टेंस वेरिएबल (मान) की आवश्यकता होती है। हालाँकि, आप ConfigurationManagerइंटरफ़ेस के चारों ओर एक स्थिर आवरण लिख सकते हैं । यदि आप आवरण को लागू करते हैं, तो आपको एक्सटेंशन विधि की आवश्यकता नहीं है क्योंकि आप सीधे विधि जोड़ सकते हैं।

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

      .....

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

8
@ उपसर्ग - संदर्भ में, यह विचार होगा कि "क्या मैं एक विशिष्ट अनुभाग प्राप्त करने के लिए कॉन्फ़िगरेशन प्रबंधक वर्ग में एक विस्तार विधि जोड़ सकता हूं?" आप किसी स्थिर वर्ग में एक्सटेंशन विधि नहीं जोड़ सकते क्योंकि इसके लिए ऑब्जेक्ट की आवृत्ति की आवश्यकता होती है, लेकिन आप एक रैपर क्लास (या मुखौटा) लिख सकते हैं जो एक ही हस्ताक्षर को लागू करता है और वास्तविक कॉनफ़िगरमैन के लिए वास्तविक कॉल को ख़राब करता है। आप रैपर क्लास के लिए जो भी विधि चाहते हैं उसे जोड़ सकते हैं ताकि इसे एक्सटेंशन की आवश्यकता न हो।
तवानफोसन

मुझे विन्यासन लागू करने वाली कक्षा में एक स्थिर विधि जोड़ने के लिए यह अधिक उपयोगी लगता है। इसलिए MyConfigurationSection नामक एक कार्यान्वयन को देखते हुए, मैं MyConfigurationSection.GetSection () को कॉल करूंगा, जो कि पहले से ही टाइप किए गए सेक्शन को वापस कर देता है, या यदि यह मौजूद नहीं है तो अशक्त है। अंतिम परिणाम समान है, लेकिन यह एक वर्ग को जोड़ने से बचता है।
टैप करें

1
@tap - यह केवल एक उदाहरण है, और पहला जो मन में आया। एकल जिम्मेदारी सिद्धांत खेल में आता है, हालांकि। क्या "कंटेनर" वास्तव में कॉन्फ़िगरेशन फ़ाइल से खुद की व्याख्या करने के लिए जिम्मेदार होना चाहिए? आम तौर पर मेरे पास केवल कॉन्फ़िगरेशनसेन्डरहैंडलर होता है और कॉन्फ़िगरेशन मैनजर से आउटपुट को उपयुक्त वर्ग में डाल देता है और आवरण के साथ परेशान नहीं करता है।
तावफोसन

5
इन-हाउस उपयोग के लिए, मैंने कस्टम एक्सटेंशन्स को जोड़ने के लिए स्थिर वर्गों और संरचनाओं के 'X' वेरिएंट बनाना शुरू किया: 'कंसोल' में 'कंसोल' के लिए नए स्टैटिक तरीके हैं, 'मैथएक्स' में 'मैथ', 'कलरएक्स' के लिए नए स्टैटिक तरीके हैं। 'कलर' विधियों का विस्तार करता है, आदि बिलकुल समान नहीं हैं, लेकिन इन्टेलिविज़न में याद रखना और खोजना आसान है।
user1689175

1
@Xtro मैं मानता हूं कि यह भयानक है, लेकिन इससे बदतर नहीं है कि यह जगह में एक परीक्षण डबल का उपयोग करने में सक्षम नहीं है या इससे भी बदतर, अपने कोड का परीक्षण करने पर छोड़ दें क्योंकि स्थैतिक कक्षाएं इसे इतना कठिन बनाती हैं। Microsoft मुझसे सहमत लगता है क्योंकि यही कारण है कि उन्होंने MVC के लिए स्थिर HttpContext.Current के आसपास पाने के लिए HttpContextWrapper / HttpContextBase कक्षाएं शुरू कीं।
tvanfosson

91

क्या आप 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! हालाँकि मेरा कोड ऑब्जेक्ट के डिफॉल्ट कंस्ट्रक्टर को सीधे कॉल करता है।

स्टेटिक एक्सटेंशन इससे बेहतर होगा लेकिन हताश उपायों के लिए हताश बार कॉल करें।


2
मुझे लगता है कि डेटसेट के लिए यह ट्रिक काम करेगा, लेकिन मुझे संदेह है कि यह कंसोल क्लास के लिए काम करता है क्योंकि कंसोल स्टेटिक क्लास है, स्टेटिक टाइप्स को तर्कों के रूप में इस्तेमाल नहीं किया जा सकता है :)
थॉमसबेकर

हाँ, मैं वही बात कहने जा रहा था। यह एक गैर-स्थिर वर्ग पर छद्म स्थैतिक विस्तार विधियां हैं। ओपी एक स्थिर वर्ग पर एक विस्तार विधि थी।
मार्क ए। डोनोहे

2
यह बहुत बेहतर है और इस तरह के तरीकों के लिए बस कुछ नामकरण सम्मेलन करना आसान है XConsole, ConsoleHelperऔर इसी तरह।
एलेक्स

9
यह एक आकर्षक चाल है, लेकिन परिणाम बदबूदार है। आप एक अशक्त वस्तु बनाते हैं, फिर उस पर एक विधि कहते हैं - वर्षों के बावजूद कहा जाता है कि "अशक्त वस्तु पर एक विधि को कॉल करने से अपवाद होता है"। यह काम करता है, लेकिन .. ओह ... बाद में बनाए रखने वाले किसी को भी भ्रमित करना। मैं नीचे नहीं जाऊंगा, क्योंकि आपने जानकारी के पूल में जोड़ा है कि क्या संभव है। लेकिन मुझे पूरी उम्मीद है कि कोई भी इस तकनीक का उपयोग नहीं करता है !! अतिरिक्त शिकायत: इनमें से किसी एक विधि को पास न करें, और OO को उपवर्ग प्राप्त करने की अपेक्षा करें: विधि कहा जाता है, जो पैरामीटर घोषणा का प्रकार होगा जिसमें किसी प्रकार का पैरामीटर पारित नहीं होता है
टूलमेकरसिवे

5
यह मुश्किल है, लेकिन मुझे यह पसंद है। एक विकल्प हो (null as DataSet).Create();सकता है default(DataSet).Create();
बागफैहर

54

यह मुमकिन नहीं है।

और हां मुझे लगता है कि एमएस ने यहां गलती की।

उनका निर्णय समझ में नहीं आता है और प्रोग्रामर को (जैसा कि ऊपर वर्णित है) एक व्यर्थ रैपर क्लास लिखने के लिए मजबूर करता है।

यहाँ एक अच्छा उदाहरण है: स्थैतिक एमएस यूनिट परीक्षण वर्ग एस्टर का विस्तार करने की कोशिश कर रहा है: मुझे 1 और एस्टर विधि चाहिए AreEqual(x1,x2)

ऐसा करने का एकमात्र तरीका विभिन्न वर्गों को इंगित करना है या विभिन्न Assert विधियों के 100 के आसपास एक आवरण लिखना है। क्यों!?

यदि निर्णय उदाहरणों के विस्तार की अनुमति देने के लिए किया गया था तो मुझे स्थैतिक एक्सटेंशन की अनुमति नहीं देने का कोई तार्किक कारण नहीं दिखता है। एक बार उदाहरण बढ़ाए जाने के बाद पुस्तकालयों के सेक्शनिंग के बारे में तर्क खड़े नहीं होते हैं।


20
मैं भी Assert.Throws और Assert.DoesNotThrow को जोड़ने के लिए MS Unit Test Class Assert को विस्तारित करने का प्रयास कर रहा था और उसी समस्या का सामना कर रहा था।
स्टेफानो रिकियार्डी

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
लेकिन यह मूल स्थिर वर्ग से हर एक विधि को फिर से लागू करने की आवश्यकता की समस्या को हल नहीं करता है जिसे आप अपने आवरण में रखना चाहते हैं। यह अभी भी, एक आवरण है, हालांकि यह कोड में कम परिवर्तन की आवश्यकता होगी, की योग्यता है कि का उपयोग करता है यह ...
Binki


11

नहीं। एक्सटेंशन विधि परिभाषाएँ आपके द्वारा विस्तारित किए जा रहे प्रकार के उदाहरण की आवश्यकता होती हैं। यह दुर्भाग्य की बात है; मुझे यकीन नहीं है कि इसकी आवश्यकता क्यों है ...


4
इसका कारण यह है कि एक एक्सटेंशन विधि का उपयोग किसी ऑब्जेक्ट की आवृत्ति को बढ़ाने के लिए किया जाता है। यदि वे ऐसा नहीं करते हैं तो वे केवल नियमित स्थैतिक तरीके होंगे।
डेरेक एकिन्स

31
यह दोनों करना अच्छा होगा, है ना?

7

विस्तार विधियों के लिए, विस्तार विधियाँ स्वयं स्थिर हैं; लेकिन वे ऐसे हैं जैसे कि वे उदाहरण के तरीके हैं। चूंकि एक स्थिर वर्ग तत्काल नहीं है, इसलिए आपके पास एक्सटेंशन विधि लागू करने के लिए कक्षा का एक उदाहरण कभी नहीं होगा। इस कारण से संकलक विस्तार विधियों को स्थैतिक कक्षाओं के लिए परिभाषित करने की अनुमति नहीं देता है।

श्री ओब्नॉक्सियस ने लिखा है: "जैसा कि कोई भी उन्नत .NET डेवलपर जानता है, नया T () धीमा है क्योंकि यह System.Activator पर कॉल उत्पन्न करता है जो कॉल करने से पहले डिफ़ॉल्ट कंस्ट्रक्टर प्राप्त करने के लिए प्रतिबिंब का उपयोग करता है"।

नए () को IL "newobj" निर्देश पर संकलित किया जाता है यदि प्रकार संकलन समय पर जाना जाता है। न्यूबोज प्रत्यक्ष आह्वान के लिए एक निर्माता लेता है। System.Activator.CreateInstance () को कॉल करता है। System.Activator.CreateInstance () को लागू करने के लिए IL "कॉल" निर्देश को संकलित करें। नए () जब जेनेरिक प्रकारों के खिलाफ उपयोग किया जाता है तो इसके परिणामस्वरूप System.Activator.CreateInstance () को कॉल किया जाएगा। श्री Obnoxious द्वारा पोस्ट इस बिंदु पर स्पष्ट नहीं था ... और अच्छी तरह से, अप्रिय।

यह कोड:

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

इस IL का उत्पादन करता है:

  .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संशोधक का बिंदु C # संकलक को .स्थैतिक / विस्तार विधि के पहले पैरामीटर के बाईं ओर उदाहरण को पास करने के लिए कहना है ।

स्थिर विधियों को एक प्रकार में जोड़ने के मामले में, पहले पैरामीटर के लिए पास करने के लिए कोई उदाहरण नहीं है।


4

मैंने सिस्टम के साथ ऐसा करने की कोशिश की। जब मैं विस्तार के तरीके सीख रहा था, तो वापस नहीं आया और सफल नहीं हुआ। इसका कारण है, जैसा कि अन्य लोग उल्लेख करते हैं, क्योंकि विस्तार के तरीकों के लिए कक्षा की एक आवृत्ति की आवश्यकता होती है।


3

एक विस्तार विधि लिखना संभव नहीं है, हालांकि आपके द्वारा पूछे जा रहे व्यवहार की नकल करना संभव है।

using FooConsole = System.Console;

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

यह आपको अन्य कक्षाओं में Console.WriteBlueLine (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);           
    }
}

यह काम करता है क्योंकि जब तक यह एक ही नामस्थान पर नहीं है। समस्या यह है कि आपको प्रत्येक विधि के लिए एक प्रॉक्सी स्टेटिक विधि लिखनी होगी जो System.Console के पास है। जरूरी नहीं कि यह बुरी चीज हो, क्योंकि आप इस तरह से कुछ जोड़ सकते हैं:

    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); 
    }

जिस तरह से यह काम करता है कि आप मानक लिकलीन में कुछ हुक करते हैं। यह एक लाइन काउंट या बैड वर्ड फिल्टर या जो कुछ भी हो सकता है। जब भी आप अपने नामस्थान में कंसोल को निर्दिष्ट करते हैं तो WebProject1 और नेमस्पेस सिस्टम को आयात करें, WebProject1.Console को System.Console के नाम डिफ़ॉल्ट रूप से उन कक्षाओं के लिए चुना जाएगा जो WebProject1 में हैं। इसलिए यह कोड सभी Console.WriteLine कॉल को नीले इंसोफर में बदल देगा क्योंकि आपने कभी System.Console.WriteLine निर्दिष्ट नहीं किया है।


दुर्भाग्यवश, बेस क्लास (.NET नेट लाइब्रेरी में कई की तरह) सील होने पर एक वंश का उपयोग करने का दृष्टिकोण काम नहीं करता है
जॉर्ज बिरबिलिस

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) { }
}

तुम्हारी पसंद का:

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
मैं इस कोड को संकलित नहीं कर सकता। त्रुटि 'System.Console': स्थिर प्रकार के पैरामीटर के रूप में नहीं किया जा सकता
kuncevic.dev

हाँ, यह नहीं किया जा सकता है। धिक्कार है मुझे लगा कि तुम वहाँ कुछ कर रहे थे! स्टैटिक प्रकारों को उन तरीकों से पैरामीटर के रूप में पारित नहीं किया जा सकता है जो समझ में आता है कि मुझे लगता है। चलो बस उम्मीद करते हैं कि एमएस इस एक पर पेड़ों से लकड़ी को देखे और इसे बदल दे।
टॉम डेलोफोर्ड

3
मुझे अपना कोड संकलित करने की कोशिश करनी चाहिए थी! जैसा कि टॉम कहते हैं, यह स्थिर वर्गों के साथ काम नहीं करेगा।
तेनका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.