اجرای متد با اسم در سی شارپ (رفلکشن)

اجرای متد با اسم در سی شارپ به کمک رفلکشن ها
فراخوانی یک متد توسط نام آن که یک رشته است


گاهی اوقات به دلیل اهداف مختلفی از جمله داینامیک کردن برنامه و یا ساده‌تر کردن کد، ممکن است بخواهیم متدی را از طریق نام آن اجرا کنیم! یعنی اینکه یک رشته که شامل نام متد می‌باشد را بدون بررسی شروط if و …، به صورت خودکار اجرا کنیم!!!! بله انجام این چنین کاری به کمک رفلکشن (Reflection) ها ممکن است.

مراحل انجام کار

روش‌های مختلفی برای انجام این کار وجود دارند؛ اما در اینجا قصد داریم تا از کلاس MethodInfo موجود در فضای نامی System.Reflection استفاده کنیم. بنابراین ابتدا کد کامل زیر را در نظر بگیرید تا در ادامه به توضیح آن بپردازیم:

class Program
{
    static void Main(string[] args)
    {
        FuLLKade fullkade = new FuLLKade();

        MethodInfo method1 = fullkade.GetType().GetMethod("Print1");
        method1.Invoke(fullkade, null);

        MethodInfo method2 = fullkade.GetType().GetMethod("Print2");
        object result = method2.Invoke(fullkade, new object[1] { "FuLLKade" });
        Console.WriteLine(result);

        Console.ReadKey();
    }

    public class FuLLKade
    {
        public void Print1()
        {
            Console.WriteLine("Hello, Welcome to FuLLKade.COM");
        }

        public string Print2(string name)
        {
            return "Hello, " + name;
        }
    }
}

در اینجا ما کلاسی به اسم FuLLKade داریم (الآن برخی از خوانندگان عزیز میگن چقدر هم اسم سایتوشونو تو کدا میزارن! :D). این کلاس دو متد با نام‌های Print1 و Print2 دارد که Print1 پیامی را در کنسول چاپ کرده و خروجی ندارد؛ ولی Print2 خروجی‌ای را برمیگرداند و همچنین ورودی نیز دارد.

برای فراخوانی متد از طریق نام آن، بایستی آبجکتی از جنس کلاس MethodInfo ایجاد کنیم. ما این آبجکت را از متد سازنده‌ی آن و توسط new نمیسازیم؛ بلکه آن را از آبجکتی که قصد فراخوانی متدش را داریم خواهیم گرفت! متد GetType ای که در هر نوع آبجکتی وجود داشته و Type آن آبجکت را برمیگرداند، و آبجکت Type نیز شامل متدی با نام GetMethod می‌باشد. یعنی آبجکتی که از نوع Type است، متدی با نام GetMethod دارد که آبجکتی از نوع کلاس MethodInfo برمی‌‎گرداند. این آبحکت MethodInfo، شامل اطلاعات متدی است که نام آن را در ورودی اول GetMethod  مشخص می‌کنیم.

متد Invoke آبجکت MethodInfo نیز جهت اجرای آن متد خواهد بود! و ورودی اول آن، آبجکتی است که قصد اجرای این متد را روی آن داریم؛ و ورودی دوم آن، پارامترهای این متد است که اگر پارامتری نداشته باشد، به صورت null بوده و اگر پارامتری داشته باشد، آن‌ها را داخل یک آرایه‌ی آبجکتی ارسال میکنیم.

همچنین خروجی متد نیز در صورت موجود بود ن، آبجکتی از نوع کلاس Object خواهد بود که در صورت نیاز می‌توانیم آن را به نوعی که می‌دانیم از آن است تبدیل کنیم.

نکته
شاید بپرسید که چرا آبجکت fullkade را نیز در ورودی متد Invoke پاس داده‌ایم! دلیل آن این است که آبجکت MethodInfo، هیچ اطلاعتی از آبجکت اصلی ندارد و ما با پاس دادن آبجکت می‌گوییم که روی چه نمونه‌ای اجرا شود! بنابراین به نظرتان روی آبجت‌های دیگری که همان متد را دارند نیز اجرا خواهد شد؟! خودتان تست کنید و ببینید!

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

cp-codfk

نظرات ثبت شده بدون دیدگاه

توضیحات پیشنهادی نظرات اشتراک