使用反射在C#中创建一个具有用户定义名称的新方法。

3

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

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

类似于:

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

这个想法是用户在运行时创建一个新的方法,并随后调用它(带有a、b参数)。

我搜索了C#反射,但没有找到简单的实现方式。是否有人知道如何简单地实现?

谢谢,

1个回答

2

正如已经指出的(评论),更简单的方法就是使用lambda:

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,但是在运行时选择名称非常困难。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接