public static IProperty AddExplicitInterfaceProperty(this VirtualType declaringType, IProperty ifcProperty, IMember baseMember) { Debug.Assert(declaringType.Equals(baseMember.DeclaringType) || declaringType.GetAllBaseTypeDefinitions().Contains(baseMember.DeclaringType)); Debug.Assert(ifcProperty.DeclaringType.Kind == TypeKind.Interface); var getter = new VirtualMethod(declaringType, Accessibility.Private, "get_" + ifcProperty.FullName, new IParameter[0], ifcProperty.ReturnType, explicitImplementations: new [] { ifcProperty.Getter }, isHidden: true); getter.BodyFactory = () => { var thisParam = new IL.ILVariable(IL.VariableKind.Parameter, declaringType, -1); return(CreateExpressionFunction(getter, new IL.LdLoc(thisParam).AccessMember(baseMember))); }; var setter = ifcProperty.Setter == null ? null : new VirtualMethod(declaringType, Accessibility.Private, "get_" + ifcProperty.FullName, ifcProperty.Setter.Parameters, ifcProperty.Setter.ReturnType, explicitImplementations: new [] { ifcProperty.Setter }, isHidden: true); if (setter != null) { setter.BodyFactory = () => { var thisParam = new IL.ILVariable(IL.VariableKind.Parameter, declaringType, -1); var valueParam = new IL.ILVariable(IL.VariableKind.Parameter, declaringType, 0); return(CreateExpressionFunction(getter, new IL.LdLoc(thisParam).AssignMember(baseMember, new IL.LdLoc(valueParam)))); } } ; var prop = new VirtualProperty(declaringType, Accessibility.Private, ifcProperty.FullName, getter, setter, explicitImplementations: new [] { ifcProperty }); getter.ApplyAction(declaringType.Methods.Add); setter?.ApplyAction(declaringType.Methods.Add); prop.ApplyAction(declaringType.Properties.Add); return(prop); }