如何执行多参数Func委托方法
废话不多说,上代码
public static void ILDemo()
{
//获取当前AppDomain
AppDomain currentAppDomain = AppDomain.CurrentDomain;
//创建程序集
AssemblyName assemblyName = new AssemblyName("MyAssembly");
assemblyName.CultureInfo = System.Globalization.CultureInfo.CurrentCulture; // = "zh-CN"
assemblyName.SetPublicKeyToken(new Guid().ToByteArray());
AssemblyBuilder assBuilder = currentAppDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
//创建模块
ModuleBuilder moduleBuilder = assBuilder.DefineDynamicModule("MyAssemblyType");
//创建类型
var typeBuilder = moduleBuilder.DefineType("MyAssemblyType.MyClass", TypeAttributes.Public);
//获取委托方法对象
var DelegateFunc2 = GetMethodParam2();
Type[] mthdParams = DelegateFunc2.Method.GetParameters().Select(p => p.ParameterType).ToArray();
Type returnType = DelegateFunc2.Method.ReturnType;
//构建IL委托字段
FieldBuilder fldBuilder = typeBuilder.DefineField("DynamicField", DelegateFunc2.GetType(), FieldAttributes.Public);
//构建IL委托方法
MethodBuilder myMthdBld = typeBuilder.DefineMethod(
"addtest",
MethodAttributes.Public,
returnType,
mthdParams);
// 通过方法构建器获取一个MSIL生成器
ILGenerator ILout = myMthdBld.GetILGenerator();
ILout.Emit(OpCodes.Nop);
ILout.Emit(OpCodes.Ldarg_0);
ILout.Emit(OpCodes.Ldfld, fldBuilder);
//循环 委托方法中 变量
if (mthdParams.Length > 0)
{
for (int i = 1; i <= mthdParams.Length; i++)
{
ILout.Emit(OpCodes.Ldarg, i);
}
}
//IL方法中 执行委托方法
ILout.Emit(OpCodes.Callvirt, DelegateFunc2.GetType().GetMethod("Invoke"));
ILout.Emit(OpCodes.Ret);
//构建对象
Type t = typeBuilder.CreateType();
object o1 = Activator.CreateInstance(t);
//把委托方法 赋值给 DynamicField字段
t.GetField("DynamicField").SetValue(o1, DelegateFunc2);
//执行o1 addtest方法 为方法中参数: new object[] { "参数1", "参数2" }
var result = t.GetMethod("addtest").Invoke(o1, new object[] { "参数1", "参数2" });
Console.WriteLine("result = " + result);
Console.ReadKey();
}
/// <summary>
/// 带参数委托方法
/// 定义2个参数
/// </summary>
/// <returns></returns>
public static Delegate GetMethodParam2()
{
return (new Func<string, string, object>((string str, string str3) =>
{
return str + "_" + str3;
}));
}