সি # প্রতিবিম্ব: স্ট্রিং থেকে শ্রেণি রেফারেন্স কিভাবে পাবেন?


90

আমি এটি সি # তে করতে চাই, তবে কীভাবে:

আমার একটি ক্লাসের নাম -eg সহ একটি স্ট্রিং রয়েছে: 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), তবে আপনাকে নেমস্পেস সহ পুরো শ্রেণীর নাম জানতে হবে এবং এটি যদি বর্তমান সমাবেশ বা এমএসসিআরলিবিতে না থাকে তবে এর পরিবর্তে আপনার সমাবেশের নাম প্রয়োজন। (আদর্শভাবে, 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");

4
+1 সুন্দরভাবে সম্পন্ন - আমি একটি উত্তর যুক্ত করেছি যা দেখায় যে একবার আপনি কীভাবে পুনরুদ্ধার করে তা টাইপটি কীভাবে ব্যবহার করতে হয়। আপনি যদি চান, তবে এগিয়ে যান এবং আপনার উত্তরের সাথে আমার উদাহরণটি মার্জ করুন এবং আমি আমারটি মুছব।
অ্যান্ড্রু হ্যারে

আপনার ইতিমধ্যে গৃহীত হয়ে গেছে বলে প্রদত্ত, আমি প্রস্তাব করি যে আমরা এটি অন্যভাবে করব - আপনি আমার উত্তরে আমার সামগ্রী যুক্ত করুন, এবং আমি এটি মুছে ফেলব :)
জন স্কিটি

4
কেবল আপনার উত্তরটি আরও প্রসারিত করার জন্য, যদি আপনি নিশ্চিত হন না যে গেটটাইপ ফাংশনে পাঠ্য হিসাবে কী পাস হবে এবং আপনি এই ক্লাসটি অ্যাক্সেস করতে পারেন তবে টাইপফ (শ্রেণি) দেখুন sঅসাধারণত যোগ্যতা নাম, এটি পরিষ্কার ধারণা দেবে।
টেক এক্সপ্লোরার


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

আমরা ব্যবহার করতে পারি

টাইপ.গেটটাইপ ()

শ্রেণীর নাম পেতে এবং এটি ব্যবহার করে এটি তৈরি করতে পারে 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; }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.