public void Generate(MethodInfo newMethod) { if (newMethod.IsGenericMethod) { newMethod = newMethod.GetGenericMethodDefinition(); } FieldInfo field = typeof(DynamicWrapperBase).GetField("UnderlyingObject", BindingFlags.Instance | BindingFlags.NonPublic); ParameterInfo[] parameters = newMethod.GetParameters(); Type[] parameterTypes = (from parameter in parameters select parameter.ParameterType).ToArray <Type>(); MethodBuilder methodBuilder = this._wrapperBuilder.DefineMethod(newMethod.Name, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual, newMethod.ReturnType, parameterTypes); if (newMethod.IsGenericMethod) { methodBuilder.DefineGenericParameters((from arg in newMethod.GetGenericArguments() select arg.Name).ToArray <string>()); } ILGenerator iLGenerator = methodBuilder.GetILGenerator(); WrapperMethodBuilder.LoadUnderlyingObject(iLGenerator, field); WrapperMethodBuilder.PushParameters(parameters, iLGenerator); this.ExecuteMethod(newMethod, parameterTypes, iLGenerator); WrapperMethodBuilder.Return(iLGenerator); }
public void Generate(MethodInfo newMethod) { if (newMethod.IsGenericMethod) { newMethod = newMethod.GetGenericMethodDefinition(); } FieldInfo field = typeof(DynamicWrapperBase).GetField("UnderlyingObject", BindingFlags.Instance | BindingFlags.NonPublic); ParameterInfo[] parameters = newMethod.GetParameters(); Type[] parameterTypes = Enumerable.ToArray <Type>(Enumerable.Select <ParameterInfo, Type>((IEnumerable <ParameterInfo>)parameters, (Func <ParameterInfo, Type>)(parameter => parameter.ParameterType))); MethodBuilder methodBuilder = this._wrapperBuilder.DefineMethod(newMethod.Name, MethodAttributes.Public | MethodAttributes.Virtual, newMethod.ReturnType, parameterTypes); if (newMethod.IsGenericMethod) { methodBuilder.DefineGenericParameters(Enumerable.ToArray <string>(Enumerable.Select <Type, string>((IEnumerable <Type>)newMethod.GetGenericArguments(), (Func <Type, string>)(arg => arg.Name)))); } ILGenerator ilGenerator = methodBuilder.GetILGenerator(); WrapperMethodBuilder.LoadUnderlyingObject(ilGenerator, field); WrapperMethodBuilder.PushParameters((ICollection <ParameterInfo>)parameters, ilGenerator); this.ExecuteMethod((MethodBase)newMethod, parameterTypes, ilGenerator); WrapperMethodBuilder.Return(ilGenerator); }