我想在RunTime上创建一个方法。 我希望用户输入一个字符串,方法的名称将是DynamicallyDefonedMethod _ ####(以用户字符串结尾)。
我希望在方法体中嵌入相同的字符串: 它将调用StaticallyDefinedMethod(####,a,b)
类似的东西:
public MyClass1 DynamicallyDefonedMethod_#### (int a, int b)
{
return StaticallyDefinedMethod (####, a, b)
}
这个想法是用户将在运行时创建一个新方法并在之后调用它(使用a,b参数)。
我用谷歌搜索了C#反射,但发现没有简单的方法。 有人知道怎么做吗?此致
答案 0 :(得分: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
,但很难在运行时使用dynamic
选择名称。