سؤال

هل هناك طريقة لاستخدام العمل لاستدعاء أسلوب بناء على قيمة السلسلة التي تحتوي على اسم هذه الطريقة؟

هل كانت مفيدة؟

المحلول

وAction<T> هو مجرد نوع مندوب التي يمكن أن تشير إلى وجود طريقة معينة. إذا كنت ترغب في استدعاء أسلوب الذي يعرف فقط في وقت التشغيل الاسم، وتخزينها في متغير سلسلة، تحتاج لديك لاستخدام التفكير:

class Program
{
    static void Main(string[] args)
    {
        string nameOfTheMethodToCall = "Test";
        typeof(Program).InvokeMember(
            nameOfTheMethodToCall, 
            BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static, 
            null, 
            null, 
            null);
    }

    static void Test()
    {
        Console.WriteLine("Hello from Test method");
    }
}

وكما اقترحAndrew هل يمكن استخدام Delegate.CreateDelegate لخلق نوع مندوب من MethodInfo:

class Program
{
    static void Main(string[] args)
    {
        string nameOfTheMethodToCall = "Test";
        var mi = typeof(Program).GetMethod(nameOfTheMethodToCall, BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static);
        var del = (Action)Delegate.CreateDelegate(typeof(Action), mi);
        del();
    }

    static void Test()
    {
        Console.WriteLine("Hello from Test method");
    }
}

نصائح أخرى

وأنا لا أعتقد أنك تريد حقا Action<T> فقط بطريقة نظامية.

public void CallMethod<T>(T instance, string methodName) { 
    MethodInfo method = typeof(T).GetMethod(methodName);
    if (method != null) {
        method.Invoke(instance, null);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top