создать новый метод с определенным пользователем именем.Отражение C # - PullRequest
3 голосов
/ 06 марта 2011

Я хочу создать метод в RunTime. Я хочу, чтобы пользователь ввел строку, и имя метода будет DynamicallyDefonedMethod _ #### (оканчивается строкой пользователя).

я хочу, чтобы в тело метода была вставлена ​​та же строка: Он будет вызывать StaticallyDefinedMethod (####, a, b)

Что-то вроде:

public MyClass1 DynamicallyDefonedMethod_#### (int a, int b)
{
return  StaticallyDefinedMethod (####, a, b)
}

Идея состоит в том, что пользователь создаст новый метод во время выполнения и вызовет его позже (с параметрами a, b).

Я погуглил C # отражение, но не нашел простого способа сделать это. Кто-нибудь знает, как это сделать просто?

С уважением,

1 Ответ

2 голосов
/ 06 марта 2011

Как уже отмечалось (комментарии), подход проще заключается просто в использовании лямбды:

Func<int,int,Whatever> func = (a,b) => StaticallyDefinedMethod(s,a,b);

, но вы также можете использовать метапрограммирование для этого (ниже).Здесь вы контролируете имя метода и обладаете большей гибкостью (не то, что вам здесь нужно).Но обратите внимание, что на самом деле не добавляет метод к типу - динамический метод является отдельным и отключенным.Вы не можете действительно добавлять элементы к типам во время выполнения.

using System;
using System.Reflection.Emit;
public class MyClass1  {
    static void Main()
    {
        var foo = CreateMethod("Foo");
        string s = foo(123, 456);
        Console.WriteLine(s);
    }
    static Func<int,int,string> CreateMethod(string s)
    {
        var method = new DynamicMethod("DynamicallyDefonedMethod_" + s,
            typeof(string),
            new Type[] { typeof(int), typeof(int) });
        var il = method.GetILGenerator();
        il.Emit(OpCodes.Ldstr, s);
        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_1);
        il.EmitCall(OpCodes.Call, typeof(MyClass1).GetMethod("StaticallyDefinedMethod"), null);
        il.Emit(OpCodes.Ret);
        return (Func<int,int,string>)method.CreateDelegate(typeof(Func<int, int, string>));
    }
    public static string StaticallyDefinedMethod(string s, int a, int b)
    {
        return s + "; " + a + "/" + b;
    }
}

Последняя мысль здесь может заключаться в использовании dynamic, но очень трудно выбирать имена во время выполнения сdynamic.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...