Как программно вызвать метод через Reflection и / или ILGenerator.Emit? - PullRequest
0 голосов
/ 27 февраля 2019

Предположим, у меня есть код, который получает список вызовов методов во время выполнения:

    static void Main(string[] args)
    {
        var foo = new Foo();
        var code0 = "DoThis()";
        foo.DynamicCalls(code0);
        var code1 = "DoThis(1)";
        foo.DynamicCalls(code1);
        var code2 = $"DoThat({"Hey"})";
        foo.DynamicCalls(code2);
        // and so on
    }

Как программно вызвать эти вызовы методов?

Это то, что у меня есть, и ячувствую, что я что-то упускаю.

public class Foo
{
    public void DoThis()
    {
        Console.WriteLine($"Doing this {0}");
    }
    public void DoThis(int count)
    {
        Console.WriteLine($"Doing this {count}");
    }

    public void DoThat(string message)
    {
        Console.WriteLine($"Doing that {message}");
    }

    public void DynamicCalls(string codeToExecute)
    {

        EmitCompileAndExecute(codeToExecute); //how?

        /*
        var targetMethodName = string.Concat(codeToExecute.TakeWhile(z => z != '('));
        var stringArgs = string.Concat(codeToExecute.SkipWhile(z => z != '(')
            .Skip(1)
            .TakeWhile(z => z != ')'))?.Trim()
            .Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

        var methodInfo = this.GetType().GetTypeInfo().GetRuntimeMethods()
            .SingleOrDefault(z => z.Name.Equals(targetMethodName, StringComparison.OrdinalIgnoreCase) 
             & stringArgs.Length == z.GetParameters().Length);


        // mi.Invoke(this, stringArgs); // args need to match type!


        DynamicMethod dm = new DynamicMethod("foo", null, null);
        ILGenerator gen = dm.GetILGenerator();
        foreach (string arg in stringArgs)
        {

        }
        */

    }

}
...