コード例 #1
0
        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;
        }