C # परावर्तन: स्ट्रिंग से वर्ग संदर्भ कैसे प्राप्त करें?


90

मैं इसे C # में करना चाहता हूं, लेकिन मुझे नहीं पता कि कैसे:

मेरे पास वर्ग नाम के साथ एक स्ट्रिंग है: FooClassऔर मैं इस वर्ग पर एक (स्थिर) विधि लागू करना चाहता हूं:

FooClass.MyMethod();

जाहिर है, मुझे प्रतिबिंब के माध्यम से कक्षा का संदर्भ खोजने की आवश्यकता है, लेकिन कैसे?

जवाबों:


125

आप Type.GetTypeविधि का उपयोग करना चाहेंगे ।

यहाँ एक बहुत ही सरल उदाहरण दिया गया है:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type t = Type.GetType("Foo");
        MethodInfo method 
             = t.GetMethod("Bar", BindingFlags.Static | BindingFlags.Public);

        method.Invoke(null, null);
    }
}

class Foo
{
    public static void Bar()
    {
        Console.WriteLine("Bar");
    }
}

मैं सरल कहता हूं क्योंकि इस प्रकार का एक प्रकार खोजना बहुत आसान है जो एक ही विधानसभा के लिए आंतरिक है। कृपया जॉन के उत्तर को अधिक गहन विवरण के लिए देखें कि आपको इसके बारे में क्या जानना होगा। एक बार जब आप मेरा उदाहरण टाइप कर लेते हैं तो आपको पता चलता है कि विधि कैसे लागू की जाती है।


101

आप उपयोग कर सकते हैं Type.GetType(string), लेकिन आपको नाम स्थान सहित पूर्ण वर्ग नाम जानना होगा , और यदि यह वर्तमान विधानसभा या mscorlib में नहीं है, तो आपको इसके बजाय विधानसभा नाम की आवश्यकता होगी। (आदर्श रूप में, उपयोग करेंAssembly.GetType(typeName) इसके बजाय का - मुझे लगता है कि विधानसभा संदर्भ सही होने के मामले में आसान है!)

उदाहरण के लिए:

// "I know String is in the same assembly as Int32..."
Type stringType = typeof(int).Assembly.GetType("System.String");

// "It's in the current assembly"
Type myType = Type.GetType("MyNamespace.MyType");

// "It's in System.Windows.Forms.dll..."
Type formType = Type.GetType ("System.Windows.Forms.Form, " + 
    "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, " + 
    "PublicKeyToken=b77a5c561934e089");

1
+1 किया गया - मैंने एक उत्तर जोड़ा है जो दिखाता है कि आपने इसे प्राप्त करने के बाद किस प्रकार का उपयोग किया है। यदि आप चाहते हैं, तो आगे बढ़ें और मेरे उदाहरण को आपके उत्तर में मिला दें और मैं अपना हटा दूंगा।
एंड्रयू हरे

यह देखते हुए कि आपका पहले ही स्वीकार किया जा चुका है, मेरा सुझाव है कि हम इसे दूसरे तरीके से करें - आप अपनी सामग्री को अपने उत्तर में जोड़ें, और मैं इसे हटा दूंगा :)
जॉन स्कीट

4
बस अपने उत्तर को और अधिक विस्तारित करने के लिए, यदि आप सुनिश्चित नहीं हैं कि गेटटाइप फ़ंक्शन के पाठ के रूप में क्या पास करना है और आप इस वर्ग तक पहुंच सकते हैं तो टाइपोफ़ (कक्षा) को देखें।
TechExplorer


7

उत्तर के लिए थोड़ा देर हो गई लेकिन यह चाल चलनी चाहिए

Type myType = Type.GetType("AssemblyQualifiedName");

आपका विधानसभा योग्य नाम इस तरह होना चाहिए

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"

4
स्पष्ट रूप से स्पष्ट करने के लिए धन्यवाद कि विधानसभा योग्य नाम कैसा दिखना चाहिए।
ड्रू

3

Type.GetType के माध्यम से आप टाइप जानकारी प्राप्त कर सकते हैं। आप विधि की जानकारी प्राप्त करने के लिए इस वर्ग का उपयोग कर सकते हैं और फिर विधि को लागू कर सकते हैं (स्थिर विधियों के लिए, पहले पैरामीटर को छोड़ दें)।

प्रकार की सही पहचान करने के लिए आपको असेंबली नाम की भी आवश्यकता हो सकती है ।

यदि प्रकार वर्तमान में असेंबली निष्पादित कर रहा है या Mscorlib.dll में है, तो यह अपने नामस्थान द्वारा योग्य टाइप नाम की आपूर्ति करने के लिए पर्याप्त है।


0

हम प्रयोग कर सकते हैं

Type.GetType ()

वर्ग नाम प्राप्त करने के लिए और इसका उपयोग करके वस्तु भी बना सकते हैं Activator.CreateInstance(type);

using System;
using System.Reflection;

namespace MyApplication
{
    class Application
    {
        static void Main()
        {
            Type type = Type.GetType("MyApplication.Action");
            if (type == null)
            {
                throw new Exception("Type not found.");
            }
            var instance = Activator.CreateInstance(type);
            //or
            var newClass = System.Reflection.Assembly.GetAssembly(type).CreateInstance("MyApplication.Action");
        }
    }

    public class Action
    {
        public string key { get; set; }
        public string Value { get; set; }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.