public void EmitSimplePropertyMembers(CodeTypeDeclaration type, CodeSnippetExpression storage, CodeTypeReference interfaceType, bool changed, string name) { CodeIndexerExpression index = new CodeIndexerExpression(storage.Field("Values"), "this.OffsetStorage + {0}".Expr(Decorator.OffsetStorage)); // getter method Action <CodeStatementCollection> getter = get => { get.Add( new CodeMethodReturnStatement( new CodeFieldReferenceExpression(index, StorageField) ) ); }; // setter method Action <CodeStatementCollection> setter = set => { PropertyStateSettings s = Decorator.Definition.StateAssetSettings; if (s != null && VerifyModify) { EmitAllowedCheck(set); } // allows emission of a validator snippet EmitSetPropertyValidator(set, type, storage, interfaceType, changed, name); if (changed) { set.Add("{0} oldValue".Expr(Decorator.ClrType)); set.Add("oldValue".Expr().Assign(new CodeFieldReferenceExpression(index, StorageField))); } set.Add(new CodeAssignStatement( new CodeFieldReferenceExpression(index, StorageField), new CodeVariableReferenceExpression("value") )); if (changed) { string diff = Decorator.Definition.PropertyType.StrictCompare ? "Diff_Strict" : "Diff"; set.If("Ascension.Networking.NetworkValue.{0}(oldValue, value)".Expr(diff), body => { EmitPropertyChanged(body, storage); }); } }; if (!AllowSetter) { setter = null; } CodeMemberProperty property = type.DeclareProperty(Decorator.ClrType, name, getter, setter); property.PrivateImplementationType = interfaceType; property.Attributes = Decorator.Attributes; }