使用用户定义的名称创建新方法。反射C#

使用用户定义的名称创建新方法。反射C#,c#,reflection,C#,Reflection,我想在运行时创建一个方法。 我希望用户输入一个字符串,该方法的名称将是DynamicallyDefonedMethod 35;####(以用户字符串结尾) 我希望在方法的主体中嵌入相同的字符串: 它将调用StaticallyDefinedMethod(######,a,b) 比如: public MyClass1 DynamicallyDefonedMethod_#### (int a, int b) { return StaticallyDefinedMethod (####, a, b)

我想在运行时创建一个方法。 我希望用户输入一个字符串,该方法的名称将是DynamicallyDefonedMethod 35;####(以用户字符串结尾)

我希望在方法的主体中嵌入相同的字符串: 它将调用StaticallyDefinedMethod(######,a,b)

比如:

public MyClass1 DynamicallyDefonedMethod_#### (int a, int b)
{
return  StaticallyDefinedMethod (####, a, b)
}
其思想是,用户将在运行时创建一个新方法,然后调用它(使用a、b参数)

我在谷歌上搜索了C#reflection,但没有找到简单的方法。 有人知道如何简单地做到这一点吗

关于,

如前所述(注释),更简单的方法是使用lambda:

Func<int,int,Whatever> func = (a,b) => StaticallyDefinedMethod(s,a,b);
Func-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;
    }
}
使用系统;
使用System.Reflection.Emit;
公共课MyClass1{
静态void Main()
{
var foo=CreateMethod(“foo”);
字符串s=foo(123456);
控制台。写入线(s);
}
静态Func CreateMethod(字符串s)
{
var方法=新的DynamicMethod(“DynamicallyDefonedMethod”+s,
类型(字符串),
新类型[]{typeof(int),typeof(int)});
var il=method.GetILGenerator();
il.Emit(opcode.Ldstr,s);
il.Emit(操作码.Ldarg_0);
il.Emit(操作码Ldarg_1);
EmitCall(OpCodes.Call,typeof(MyClass1).GetMethod(“StaticallyDefinedMethod”),null;
发射(操作码Ret);
return(Func)方法.CreateDelegate(typeof(Func));
}
公共静态字符串StaticallyDefinedMethod(字符串s,int a,int b)
{
返回s+“;”+a+“/”+b;
}
}
这里的最后一个想法可能是使用
dynamic
,但是在运行时使用
dynamic
很难选择名称