예제 #1
0
        protected CodeExpression GenerateSingleton(CodeTypeDeclaration @class, CodeTypeReference type, string fieldName, CodeExpression initializer)
        {
            var cctor = Declare.Constructor( ).Static( )
                        .AddComment(SingletonBeforeFieldInitComment);

            if (CodeDomProvider.Supports(GeneratorSupport.NestedTypes))
            {
                var lazyType = Declare.NestedClass(fieldName).Private( ).Static( )
                               .AddTo(@class);

                cctor.AddTo(lazyType);

                Declare.Field(type, SingletonFieldName).Internal( ).Static( )
                .Initialize(initializer)
                .AddTo(lazyType);

                return(Code.Type(fieldName).Local( )
                       .Static( )
                       .Field(SingletonFieldName));
            }
            else
            {
                Declare.Field(type, fieldName).Private( ).Static( )
                .Initialize(initializer)
                .AddTo(@class);

                if ([email protected] <CodeTypeConstructor> ( ).Any( ))
                {
                    @class.Members.Add(cctor);
                }

                return(Code.Static( ).Field(fieldName));
            }
        }
예제 #2
0
        protected virtual void GenerateClassMembers(CodeTypeDeclaration @class)
        {
            var editorBrowsable      = Declare.Attribute <EditorBrowsableAttribute> (Code.Constant(EditorBrowsableState.Advanced));
            var notifyCultureChanged = (CodeExpression)null;

            var ctor = Declare.Constructor( )
                       .AddSummary(ConstructorSummaryFormat, settings.ClassName)
                       .Attributed(Declare.Attribute <SuppressMessageAttribute> ("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode"))
                       .AddTo(@class);

            if (settings.AccessModifiers.HasBitMask(MemberAttributes.Static))
            {
                ctor.Private( );
            }
            else
            {
                ctor.Modifiers(settings.AccessModifiers);
            }

            if ((settings.Options & ResourceTypeOptions.CultureChangedEvent) == ResourceTypeOptions.CultureChangedEvent)
            {
                GenerateCultureChangedEvent(@class, out notifyCultureChanged);
            }

            var resourceManager = GenerateSingleton(@class,
                                                    settings.ResourceManagerType,
                                                    ResourceManagerFieldName,
                                                    settings.ResourceManagerInitializer);

            if (settings.LocalizerType != null)
            {
                var localizer = GenerateSingleton(@class,
                                                  settings.LocalizerType,
                                                  LocalizerFieldName,
                                                  settings.LocalizerInitializer);

                Declare.Property(settings.LocalizerType, LocalizerPropertyName).Static( )
                .Modifiers(settings.AccessModifiers)
                .Get(get => get.Return(localizer))
                .AddSummary(LocalizerPropertySummary)
                .AddTo(@class);
            }

            Declare.Property(settings.ResourceManagerType, ResourceManagerPropertyName).Static( )
            .Modifiers(settings.AccessModifiers)
            .Get(get => get.Return(resourceManager))
            .AddSummary(ResourceManagerPropertySummary)
            .Attributed(editorBrowsable)
            .AddTo(@class);

            var cultureField = Declare.Field <CultureInfo> (CultureInfoFieldName)
                               .Modifiers(settings.AccessModifiers & MemberAttributes.Static)
                               .AddTo(@class);

            var field = @class.Instance( ).Field(CultureInfoFieldName);

            Declare.Property <CultureInfo> (CultureInfoPropertyName)
            .Modifiers(settings.AccessModifiers)
            .Get(get => get.Return(field))
            .Set((set, value) =>
            {
                set.Add(Code.If(field.ObjectEquals(value))
                        .Then(Code.Return( )));
                set.Add(field.Assign(value));
                if (notifyCultureChanged != null)
                {
                    set.Add(notifyCultureChanged);
                }
            })
            .AddSummary(CultureInfoPropertySummary)
            .Attributed(editorBrowsable)
            .AddTo(@class);
        }