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)); } }
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); }