c# - मैं कई कक्षाओं में एक विस्तार विधि कैसे जोड़ सकता हूं?




reflection (6)

मेरे पास लगभग 1000 वर्ग हैं जिनमें मुझे गुणों की संख्या गिनने की आवश्यकता है। मेरे पास निम्न कोड है:

    public static int NumberOfProperties()
    {
        Type type = typeof(C507);
        return type.GetProperties().Count();
    }

मैं typeof पैरामीटर को बदलने वाले प्रत्येक वर्ग में इसे कॉपी और पेस्ट कर सकता हूं लेकिन यह थोड़ा कठिन लगता है।

क्या वैसे भी var nop = C507.NumberOfProperties(); कर कर ऐसा करने के लिए एक्सटेंशन विधि बनाने के लिए है var nop = C507.NumberOfProperties(); ?


आप इस तरह की object पर एक विस्तार विधि बना सकते हैं:

public static int PropertyCount(this object thing)
{
    return thing.GetType().GetProperties().Count();
}

और इसे किसी भी ऑब्जेक्ट पर इस्तेमाल करें:

var x = "some string";
var numProps = x.PropertyCount();

आप एक सामान्य विस्तार विधि बना सकते हैं जो सभी प्रकारों पर लागू हो सकता है:

public static int PropertyCount<T>(this T obj)
{
    return typeof(T).GetProperties().Length;
}

यह सभी प्रकारों पर लागू होगा जिसमें मूल्य प्रकार (आईई structs) शामिल हैं जो ऑब्जेक्ट पर लागू नहीं होंगे। यहां मेरी गलती को इंगित करने के लिए piedar लिए धन्यवाद, ऑब्जेक्ट पर लागू करने से अभी भी इस एक्सटेंशन विधि को मूल्य प्रकारों में जोड़ दिया जाता है।


जैसा कि आप कल्पना करते हैं, एक स्थिर विस्तार विधि होना असंभव है। ऐसा कहा जा रहा है कि, एक सहायक वर्ग में एक सामान्य विधि बनाना संभव होगा।

public static int NumberOfProperties<T>()
{
    Type type = typeof(T);
    return type.GetProperties().Count();
}

किसी प्रकार को कुछ प्रकार दिया गया है इसे int n = NumberOfProperties<SomeType>() रूप में कहा जा सकता है।


तो आप एक एक्सटेंशन विधि लिख सकते हैं जो ऑब्जेक्ट का उपयोग करता है या टाइप का उपयोग करता है।

public static class ObjectExtensions
{
    public static int GetNumberOfProperties(this object value)
    {
        return value.GetType().GetProperties().Count();
    }

    public static int GetNumberOfProperties(this Type value)
    {
        return value.GetProperties().Count();
    }
}

उपयोग:

new C507().GetNumberOfProperties();
typeof(C507).GetNumberOfProperties();

हालांकि, आप स्पष्ट रूप से दो चीजें बताते हैं :

मैं इसे टाइप करने वाले प्रत्येक वर्ग में कॉपी और पेस्ट कर सकता हूं

मेरे पास लगभग 1000 वर्ग हैं

आप शायद 1000 कक्षाओं को तुरंत चालू नहीं करना चाहते हैं या प्रतिलिपि typeof() 1000 गुना प्रतिलिपि बनाना चाहते हैं

इस मामले में, आप उन्हें विधानसभा से सभी पढ़ना चाहेंगे।

तो कुछ ऐसा है:

typeof(SomeClass).Assembly.GetTypes().Select(x => new
  {
       x.Name, 
       PropertyCount = x.GetType().GetProperties().Count()
  });

जहां कुछ क्लास एक वर्ग है (इससे कोई फर्क नहीं पड़ता) जहां सभी वर्ग रहते हैं।

मैं बस उन्हें एक अज्ञात ऑब्जेक्ट में चुनता हूं जिसमें प्रकार का नाम और संपत्ति गणना होती है।

इस:

typeof(SomeClass).Assembly

असेंबली पाने के लिए सिर्फ एक दृढ़ तरीका है। अन्य तरीके हैं।

Assembly.GetAssembly(typeof(Program)).GetTypes()
Assembly.GetCallingAssembly().GetTypes()
Assembly.Load("Some Assemble Ref").GetTypes()

आप जो प्रकार ढूंढते हैं उसके साथ आप ऑलॉर्ट्स कर सकते हैं। यदि आप Type स्वयं चुनते हैं, तो आप इसे बाद में Activator.CreateInstance का उपयोग कर तुरंत कर सकते हैं। Activator.CreateInstance (यदि इसमें पैरामीटर रहित कंसक्टर है)। आप संपत्तियों को प्रतिबिंब के साथ भी भर सकते हैं।


यदि आप object पर एक्सटेंशन विधि चाहते हैं:

public static ObjectExtensions
{
    public static int NumberOfProperties(this object value)
    {
        if (null == value)
          throw new ArgumentNullException("value"); // or return 0

        // Length: no need in Linq here
        return value.GetType().GetProperties().Length;
    }
}

...

C507 myObj = new C507();

// How many properties does myObj instance have?
int propCount = myObj.NumberOfProperties(); 

यदि आप Type पर एक्स्टेसियन विधि चाहते हैं:

   public static TypeExtensions
    {
        public static int NumberOfProperties(this Type value)
        {
            if (null == value)
              throw new ArgumentNullException("value"); // or return 0

            // Length: no need in Linq here
            return value.GetProperties().Length;
        }
    }

    ...


    // How many properties does C507 type have?
    int propCount = typeof(C507).NumberOfProperties(); 

यदि आपका वर्गीकृत इंटरफेस को कार्यान्वित कर सकता है, तो आप उस इंटरफेस को बढ़ा सकते हैं।

public interface IExtensible {
}

class C507 : IExtensible {

}

public static int NumberOfProperties(this IExtensible extensible)
{
    Type type = extensible.GetType();
    return type.GetProperties().Count();
}

ऐसा कहा जा रहा है कि सैकड़ों (जेनरेटेड) कक्षाएं शुरू करने के लिए एक खराब समाधान की तरह दिखती हैं।





reflection