public virtual void GenerateMethod(PropertyInfo pi, MethodInfo mi, ILGenerator gen) { // Set default values for out parameters foreach (var par in mi.GetParameters().Where(p => p.IsOut)) { var defaultAttr = par.GetCustomAttributes(typeof(SafeDefaultAttribute), true) .Cast<SafeDefaultAttribute>().FirstOrDefault(); var type = par.ParameterType.GetElementType(); gen.EmitBestLdArg((ushort)(par.Position + 1)); if (defaultAttr!=null) defaultAttr.PushValueAction(gen); else PushDefaultReturnValue(gen, type); gen.EmitStoreToRef(type); } // Set default value for return types if (mi.ReturnType!=typeof(void)) { MemberInfo attrSource = mi; if (pi!=null) attrSource = pi; var defaultAttr = attrSource.GetCustomAttributes(typeof(SafeDefaultAttribute), true) .Cast<SafeDefaultAttribute>().FirstOrDefault(); if (defaultAttr!=null) defaultAttr.PushValueAction(gen); else PushDefaultReturnValue(gen, mi.ReturnType); } gen.Emit(OpCodes.Ret); }
public override void GenerateOutConversion(object token, Action load, IProxyModuleCoderAccess proxyModule, ILGenerator gen) { var local = (LocalBuilder)token; load(); gen.Emit(OpCodes.Ldloc, local); _valueBinding.GenerateConversion(proxyModule, gen); gen.EmitStoreToRef(_fromType); }