protected internal override Delegate CreateDelegate() { MemberInfo member = LookupUtils.GetMember(CallInfo); bool handleInnerStruct = CallInfo.ShouldHandleInnerStruct; if (handleInnerStruct) { Generator .ldarg_0 // load arg-0 (this) .DeclareLocal(CallInfo.TargetType); // TargetType tmpStr LoadInnerStructToLocal(0); // tmpStr = ((ValueTypeHolder)this)).Value Generator.DeclareLocal(Constants.ObjectType); // object result; } else if (!CallInfo.IsStatic) { Generator .ldarg_0 // load arg-0 (this) .castclass(CallInfo.TargetType); // (TargetType)this } if (member.MemberType == MemberTypes.Field) { var field = member as FieldInfo; Generator .ldfld(CallInfo.IsStatic, field) // (this|tmpStr).field OR TargetType.field .boxIfValueType(field.FieldType); // (object)<stack> } else { PropertyInfo prop = member as PropertyInfo; MethodInfo getMethod = LookupUtils.GetPropertyGetMethod(prop, CallInfo); Generator .call(CallInfo.IsStatic || CallInfo.IsTargetTypeStruct, getMethod) // (this|tmpStr).prop OR TargetType.prop .boxIfValueType(prop.PropertyType); // (object)<stack> } if (handleInnerStruct) { Generator.stloc_1.end(); // resultLocal = <stack> StoreLocalToInnerStruct(0); // ((ValueTypeHolder)this)).Value = tmpStr Generator.ldloc_1.end(); // push resultLocal } Generator.ret(); return(CallInfo.IsStatic ? Method.CreateDelegate(typeof(StaticMemberGetter)) : Method.CreateDelegate(typeof(MemberGetter))); }
protected internal override Delegate CreateDelegate() { MemberInfo member = LookupUtils.GetMember(CallInfo); bool handleInnerStruct = CallInfo.ShouldHandleInnerStruct; Generator.ldarg_0.end(); // load arg-0 (this or value-to-be-set) if (handleInnerStruct) { Generator.DeclareLocal(CallInfo.TargetType); // TargetType tmpStr LoadInnerStructToLocal(0); // tmpStr = ((ValueTypeHolder)this)).Value; Generator.ldarg_1.end(); // load value-to-be-set; } else if (!CallInfo.IsStatic) { Generator.castclass(CallInfo.TargetType) // (TargetType)this .ldarg_1.end(); // load value-to-be-set; } Type memberType = member is FieldInfo ? ((FieldInfo)member).FieldType : ((PropertyInfo)member).PropertyType; Generator.CastFromObject(memberType); // unbox | cast value-to-be-set if (member.MemberType == MemberTypes.Field) { Generator.stfld(CallInfo.IsStatic, (FieldInfo)member); // (this|tmpStr).field = value-to-be-set; } else { MethodInfo setMethod = LookupUtils.GetPropertySetMethod((PropertyInfo)member, CallInfo); Generator.call(CallInfo.IsStatic || CallInfo.IsTargetTypeStruct, setMethod); // (this|tmpStr).set_Prop(value-to-be-set); } if (handleInnerStruct) { StoreLocalToInnerStruct(0); // ((ValueTypeHolder)this)).Value = tmpStr } Generator.ret(); return(CallInfo.IsStatic ? Method.CreateDelegate(typeof(StaticMemberSetter)) : Method.CreateDelegate(typeof(MemberSetter))); }