Dynamically invoking any function by passing function name as string

后端 未结 5 577
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-01 03:54

How do I automate the process of getting an instance created and its function executed dynamically?

Thanks

Edit: Need an option to pass parameters too. Thank

5条回答
  •  [愿得一人]
    2020-12-01 04:29

    To invoke a constructor, Activator.CreateInstance will do the trick. It has a bunch of overloads to make your life easier.

    If your constructor is parameterless:

    object instance = Activator.CreateInstance(type)
    

    If you need parameters:

    object instance =  Activator.CreateInstance(type, param1, param2)
    

    To invoke, a method, once you have the Type object you can call GetMethod to get the method, and then Invoke (with or without parameters) to invoke it. Should you need it, Invoke will also give you the return value of the function you're calling (or null if its a void method),

    For a slightly more detailed sample (paste into a console app and go):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Reflection;
    
    namespace Test
    {
        public static class Invoker
        {
            public static object CreateAndInvoke(string typeName, object[] constructorArgs, string methodName, object[] methodArgs)
            {
                Type type = Type.GetType(typeName);
                object instance = Activator.CreateInstance(type, constructorArgs);
    
                MethodInfo method = type.GetMethod(methodName);
                return method.Invoke(instance, methodArgs);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                // Default constructor, void method
                Invoker.CreateAndInvoke("Test.Tester", null, "TestMethod", null);
    
                // Constructor that takes a parameter
                Invoker.CreateAndInvoke("Test.Tester", new[] { "constructorParam" }, "TestMethodUsingValueFromConstructorAndArgs", new object[] { "moo", false });
    
                // Constructor that takes a parameter, invokes a method with a return value
                string result = (string)Invoker.CreateAndInvoke("Test.Tester", new object[] { "constructorValue" }, "GetContstructorValue", null);
                Console.WriteLine("Expect [constructorValue], got:" + result);
    
                Console.ReadKey(true);
            }
        }
    
        public class Tester
        {
            public string _testField;
    
            public Tester()
            {
            }
    
            public Tester(string arg)
            {
                _testField = arg;
            }
    
            public void TestMethod()
            {
                Console.WriteLine("Called TestMethod");
            }
    
            public void TestMethodWithArg(string arg)
            {
                Console.WriteLine("Called TestMethodWithArg: " + arg);
            }
    
            public void TestMethodUsingValueFromConstructorAndArgs(string arg, bool arg2)
            {
                Console.WriteLine("Called TestMethodUsingValueFromConstructorAndArg " + arg + " " + arg2 + " " + _testField);
            }
    
            public string GetContstructorValue()
            {
                return _testField;
            }
        }
    }
    

提交回复
热议问题