如果有以下类Processor.cs
public class Processor
{
public int Process(int value)
{
return value + 1;
}
}
动态调用Processor类里面的Process函数有如下几种
方法一:直接调用
Processor test = new Processor();
int i = 100;
int value =test.Process(i);
Response.Write(value.ToString());
输出:101
方法二:用反射机制,Type.InvokeMember()调用
Processor test = new Processor();
Type t = typeof(Processor);
int i=100;
int value = (int)t.InvokeMember("Process", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, test, new object[] { i });
Response.Write(value.ToString());
输出:101
方法三:通过一个委托Delegate调用
public delegate int ProcessCaller(int value);
Processor test = new Processor();
ProcessCaller processCaller = new ProcessCaller(test.Process);
int i=100;
int value = processCaller(i);
Response.Write(value.ToString());
输出:101
方法四:也通过反射机制建立委托再动态调用
Processor test = new Processor();
Type type = test.GetType();//获取类型
MethodInfo methodInfo = type.GetMethod("Process");//获取里面的方法
object[] args = {1};//表明为一个整型参数
methodInfo.Invoke(test, args);//应用Processor 里面的Process方法
Type delegateType = CreateCustomDelegate(methodInfo);//CreateCustomDelegate方法为创建自定义委托
Delegate p = Delegate.CreateDelegate(delegateType,test, "Process");
int i=100;
int value = (int)p.DynamicInvoke(new object[] { i });
Response.Write(value.ToString());
输出:101
方法四当中的CreateCustomDelegate通用方法代码如下:
首先引用using System.Reflection.Emit;
private Type CreateCustomDelegate(MethodInfo targetMethod)
{
AssemblyName assembly;
AssemblyBuilder assemblyBuilder;
ModuleBuilder modbuilder;
TypeBuilder typeBuilder;
MethodBuilder methodBuilder;
assembly = new AssemblyName();
assembly.Version = new Version(1, 0, 0, 0);
assembly.Name = "CallbackGen";
assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assembly, AssemblyBuilderAccess.RunAndSave);
modbuilder = assemblyBuilder.DefineDynamicModule("CallbackGenModule", "CallbackGen.dll", true);
// Create a delegate that has the same signature as the method we would like to hook up to
typeBuilder = modbuilder.DefineType(targetMethod.Name + "Callback", TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed |
TypeAttributes.AnsiClass | TypeAttributes.AutoClass, typeof(System.MulticastDelegate));
ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.RTSpecialName | MethodAttributes.HideBySig |
MethodAttributes.Public, CallingConventions.Standard, new Type[] { typeof(object), typeof(int) });
constructorBuilder.SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed);
// Grab the parameters of the method
ParameterInfo[] parameters = targetMethod.GetParameters();
Type[] paramTypes = new Type[parameters.Length];
for (int i = 0; i < parameters.Length; i++)
{
paramTypes[i] = parameters[i].ParameterType;
}
// Define the Invoke method for the delegate
methodBuilder = typeBuilder.DefineMethod(
"Invoke",
MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual,
CallingConventions.Standard,
targetMethod.ReturnType,
null,
new Type[] { typeof(System.Runtime.CompilerServices.CallConvCdecl) },
paramTypes,
null,
null);
methodBuilder.SetImplementationFlags(MethodImplAttributes.Runtime | MethodImplAttributes.Managed);
// bake it!
Type t = typeBuilder.CreateType();
return t;
}