Exemple #1
0
        private void AddMembers(CRflTyp aPTyp, CodeTypeDeclaration aCdTypDcl, CRflProperty aProperty)
        {
            var    aModel            = aProperty.Model;
            var    aModelInterpreter = this.ModelInterpreter;
            var    aCodeDomBuilder   = this.CodeDomBuilder;
            var    aPTypNme          = this.ModelInterpreter.GetTypName(aPTyp, true);
            var    aCdPTypRef        = new CodeTypeReference(aPTypNme);
            var    aCdPTypRefExp     = new CodeTypeReferenceExpression(aCdPTypRef);
            var    aCTyp             = this.ModelInterpreter.GetReturnTyp(aProperty);
            var    aPrpNme           = aProperty.Name;
            string aMtaFldTypNme;
            var    aMtaPrpNme    = this.Tok.GetRelationyMetaInfoPropertyName(aPrpNme);
            var    aMtaPrpRefExp = new CodePropertyReferenceExpression(aCdPTypRefExp, aMtaPrpNme);
            var    aCTypRef      = this.CodeDomBuilder.NewCodeTypeRef(aCTyp);

            // Relations-Objects
            var aCrd           = this.ModelInterpreter.GetCardinality(aProperty);
            var aRelTypName    = this.ModelInterpreter.GetClassName(aCrd);
            var aRelSystemType = CRef.GetRefClass(aCrd);
            var aCdRTypRef     = new CodeTypeReference(aRelTypName, this.CodeDomBuilder.NewCodeTypeRef(aPTyp), aCTypRef);
            var aCtorArgs1     = new CodeExpression[] { new CodeThisReferenceExpression(), aMtaPrpRefExp };
            var aCtorArgsBuildAttribIsDefined = aRelSystemType.IsNullRef() ? false : aRelSystemType.IsDefined(typeof(CGenCtorArgsBuilderAttribute), true);
            var aWriteOnlyBySystem            = aProperty.Interpret(() => bool.Parse(aProperty.GetAttributeValue(this.Tok.Trg_P_A_WriteOnlyBySystem, false.ToString)));
            var aCtorArgs2            = aWriteOnlyBySystem ? new CodeExpression[] { new CodeObjectCreateExpression(typeof(CAccessKey)) } : new CodeExpression[] { };
            var aCtorArgBuilderAttrib = aCtorArgsBuildAttribIsDefined ? aRelSystemType.GetCustomAttribute <CGenCtorArgsBuilderAttribute>(true) : default(CGenCtorArgsBuilderAttribute);
            var aCtorArgs3            = aCtorArgBuilderAttrib.IsNullRef() ? new CodeExpression[] { } : aCtorArgBuilderAttrib.NewCtorArgs(aModelInterpreter, aCodeDomBuilder, aProperty);
            var aCtorArgs             = aCtorArgs1.Concat(aCtorArgs2).Concat(aCtorArgs3);
            var aNewExp  = new CodeObjectCreateExpression(aCdRTypRef, aCtorArgs.ToArray());
            var aIsClass = true;
            var aLazyPrp = this.CodeDomBuilder.NewLazyLoadPrperty(aCdRTypRef, aIsClass, this.ModelInterpreter.GetEntityRefPropertyName(aProperty), aNewExp, MemberAttributes.Public | MemberAttributes.Final);

            aCdTypDcl.Members.Add(aLazyPrp.Item1);
            aCdTypDcl.Members.Add(aLazyPrp.Item2);
            var aCdPrp = aLazyPrp.Item1;

            aMtaFldTypNme = this.Tok.GeRelationMetaInfoTypName(aRelTypName);

            // Property.Attributes from System
            aCdPrp.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(CTargetTypeAttribute)), new CodeAttributeArgument(new CodeTypeOfExpression(aCTypRef))));


            // Property.Attributes from Model
            var aCdAs = this.CodeDomBuilder.NewCodeAttributeDecls(aProperty, this.ModelInterpreter);

            aCdPrp.CustomAttributes.AddRange(aCdAs.ToArray());



            // Property.NetaInfo.Field
            var aMtaFldNme = this.Tok.GetRelationMetaInfoFieldName(aPrpNme);
            //aMtaFldTypNme = this.Tok.Trg_C_Mta_P_Fld_Nme;
            var aCdMtaFldTypRef  = new CodeTypeReference(aMtaFldTypNme);
            var aCdMtaPrpFldDcl  = new CodeMemberField(aMtaFldTypNme, aMtaFldNme);
            var aCdMtaPrpInitExp = new CodeObjectCreateExpression(aCdMtaFldTypRef,
                                                                  this.CodeDomBuilder.NewTypeOfExpression(aPTypNme),
                                                                  this.CodeDomBuilder.NewNameOfPrpertyExpression(aPrpNme)
                                                                  );

            aCdMtaPrpFldDcl.Type       = aCdMtaFldTypRef;
            aCdMtaPrpFldDcl.Attributes = MemberAttributes.Static
                                         | MemberAttributes.Private
            ;
            aCdMtaPrpFldDcl.InitExpression = aCdMtaPrpInitExp;
            aCdTypDcl.Members.Add(aCdMtaPrpFldDcl);

            var aCdMtaFldRefExp = new CodeFieldReferenceExpression(aCdPTypRefExp, aMtaFldNme);

            // Property.MetaInfo.Property
            var aCdMtaPrp = new CodeMemberProperty();

            aCdMtaPrp.Name       = aMtaPrpNme;
            aCdMtaPrp.Type       = aCdMtaFldTypRef;
            aCdMtaPrp.Attributes = MemberAttributes.Static
                                   | MemberAttributes.Public
            ;
            aCdMtaPrp.HasGet = true;
            aCdMtaPrp.GetStatements.Add(new CodeMethodReturnStatement(aCdMtaFldRefExp));
            aCdTypDcl.Members.Add(aCdMtaPrp);
        }