@@ -185,7 +185,7 @@ public virtual CodeTypeReference GetReferenceFor(NamespaceModel referencingNames
185185 return new CodeTypeReference ( name ) ;
186186 }
187187
188- public virtual CodeExpression GetDefaultValueFor ( string defaultString )
188+ public virtual CodeExpression GetDefaultValueFor ( string defaultString , bool attribute )
189189 {
190190 throw new NotSupportedException ( string . Format ( "Getting default value for {0} not supported." , defaultString ) ) ;
191191 }
@@ -398,13 +398,13 @@ public override CodeTypeDeclaration Generate()
398398
399399 if ( IsMixed && ( BaseClass == null || ( BaseClass is ClassModel && ! AllBaseClasses . Any ( b => b . IsMixed ) ) ) )
400400 {
401- var propName = "Text" ;
401+ var propName = "Text" ;
402402
403403 // To not collide with any existing members
404404 for ( var propertyIndex = 1 ; Properties . Any ( x => x . Name . Equals ( propName , StringComparison . Ordinal ) ) || propName . Equals ( classDeclaration . Name , StringComparison . Ordinal ) ; propertyIndex ++ )
405- {
406- propName = $ "Text_{ propertyIndex } ";
407- }
405+ {
406+ propName = $ "Text_{ propertyIndex } ";
407+ }
408408 var text = new CodeMemberField ( typeof ( string [ ] ) , propName ) ;
409409 // hack to generate automatic property
410410 text . Name += " { get; set; }" ;
@@ -456,7 +456,7 @@ public List<ClassModel> GetAllDerivedTypes()
456456 return allDerivedTypes ;
457457 }
458458
459- public override CodeExpression GetDefaultValueFor ( string defaultString )
459+ public override CodeExpression GetDefaultValueFor ( string defaultString , bool attribute )
460460 {
461461 var rootClass = AllBaseTypes . LastOrDefault ( ) ;
462462
@@ -466,7 +466,7 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
466466
467467 using ( var writer = new System . IO . StringWriter ( ) )
468468 {
469- CSharpProvider . GenerateCodeFromExpression ( rootClass . GetDefaultValueFor ( defaultString ) , writer , new CodeGeneratorOptions ( ) ) ;
469+ CSharpProvider . GenerateCodeFromExpression ( rootClass . GetDefaultValueFor ( defaultString , attribute ) , writer , new CodeGeneratorOptions ( ) ) ;
470470 val = writer . ToString ( ) ;
471471 }
472472
@@ -480,7 +480,7 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
480480 return dv ;
481481 }
482482
483- return base . GetDefaultValueFor ( defaultString ) ;
483+ return base . GetDefaultValueFor ( defaultString , attribute ) ;
484484 }
485485 }
486486
@@ -658,8 +658,8 @@ private CodeTypeReference TypeReference
658658 {
659659 get
660660 {
661- return PropertyType . GetReferenceFor ( OwningType . Namespace ,
662- collection : IsCollection || IsArray || ( IsList && IsAttribute ) ,
661+ return PropertyType . GetReferenceFor ( OwningType . Namespace ,
662+ collection : IsCollection || IsArray || ( IsList && IsAttribute ) ,
663663 attribute : IsAttribute ) ;
664664 }
665665 }
@@ -680,6 +680,20 @@ private void AddDocs(CodeTypeMember member)
680680 member . Comments . AddRange ( DocumentationModel . GetComments ( docs ) . ToArray ( ) ) ;
681681 }
682682
683+ private CodeAttributeDeclaration CreateDefaultValueAttribute ( CodeTypeReference typeReference , CodeExpression defaultValueExpression )
684+ {
685+ var defaultValueAttribute = new CodeAttributeDeclaration ( new CodeTypeReference ( typeof ( DefaultValueAttribute ) , Configuration . CodeTypeReferenceOptions ) ) ;
686+ if ( typeReference . BaseType == "System.Decimal" )
687+ {
688+ defaultValueAttribute . Arguments . Add ( new CodeAttributeArgument ( new CodeTypeOfExpression ( typeof ( decimal ) ) ) ) ;
689+ defaultValueAttribute . Arguments . Add ( new CodeAttributeArgument ( new CodePrimitiveExpression ( DefaultValue ) ) ) ;
690+ }
691+ else
692+ defaultValueAttribute . Arguments . Add ( new CodeAttributeArgument ( defaultValueExpression ) ) ;
693+
694+ return defaultValueAttribute ;
695+ }
696+
683697 public void AddInterfaceMembersTo ( CodeTypeDeclaration typeDeclaration )
684698 {
685699 CodeTypeMember member ;
@@ -706,12 +720,11 @@ public void AddInterfaceMembersTo(CodeTypeDeclaration typeDeclaration)
706720
707721 if ( DefaultValue != null && IsNullable )
708722 {
709- var defaultValueExpression = propertyType . GetDefaultValueFor ( DefaultValue ) ;
723+ var defaultValueExpression = propertyType . GetDefaultValueFor ( DefaultValue , IsAttribute ) ;
710724
711725 if ( ( defaultValueExpression is CodePrimitiveExpression ) || ( defaultValueExpression is CodeFieldReferenceExpression ) )
712726 {
713- var defaultValueAttribute = new CodeAttributeDeclaration ( new CodeTypeReference ( typeof ( DefaultValueAttribute ) , Configuration . CodeTypeReferenceOptions ) ,
714- new CodeAttributeArgument ( defaultValueExpression ) ) ;
727+ var defaultValueAttribute = CreateDefaultValueAttribute ( typeReference , defaultValueExpression ) ;
715728 member . CustomAttributes . Add ( defaultValueAttribute ) ;
716729 }
717730 }
@@ -759,7 +772,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
759772 else
760773 member = new CodeMemberField ( typeReference , propertyName ) ;
761774
762- var isPrivateSetter = IsCollection || isArray ;
775+ var isPrivateSetter = IsCollection || isArray || ( IsList && IsAttribute ) ;
763776
764777 if ( requiresBackingField )
765778 {
@@ -775,7 +788,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
775788 }
776789 else
777790 {
778- var defaultValueExpression = propertyType . GetDefaultValueFor ( DefaultValue ) ;
791+ var defaultValueExpression = propertyType . GetDefaultValueFor ( DefaultValue , IsAttribute ) ;
779792 backingField . InitExpression = defaultValueExpression ;
780793
781794 if ( IsNillableValueType )
@@ -791,8 +804,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
791804
792805 if ( IsNullable && ( ( defaultValueExpression is CodePrimitiveExpression ) || ( defaultValueExpression is CodeFieldReferenceExpression ) ) )
793806 {
794- var defaultValueAttribute = new CodeAttributeDeclaration ( new CodeTypeReference ( typeof ( DefaultValueAttribute ) , Configuration . CodeTypeReferenceOptions ) ,
795- new CodeAttributeArgument ( defaultValueExpression ) ) ;
807+ var defaultValueAttribute = CreateDefaultValueAttribute ( typeReference , defaultValueExpression ) ;
796808 member . CustomAttributes . Add ( defaultValueAttribute ) ;
797809 }
798810 }
@@ -1139,7 +1151,7 @@ public override CodeTypeDeclaration Generate()
11391151 return enumDeclaration ;
11401152 }
11411153
1142- public override CodeExpression GetDefaultValueFor ( string defaultString )
1154+ public override CodeExpression GetDefaultValueFor ( string defaultString , bool attribute )
11431155 {
11441156 return new CodeFieldReferenceExpression ( new CodeTypeReferenceExpression ( GetReferenceFor ( referencingNamespace : null ) ) ,
11451157 Values . First ( v => v . Value == defaultString ) . Name ) ;
@@ -1221,9 +1233,16 @@ public override CodeTypeReference GetReferenceFor(NamespaceModel referencingName
12211233 return new CodeTypeReference ( type , Configuration . CodeTypeReferenceOptions ) ;
12221234 }
12231235
1224- public override CodeExpression GetDefaultValueFor ( string defaultString )
1236+ public override CodeExpression GetDefaultValueFor ( string defaultString , bool attribute )
12251237 {
1226- if ( ValueType == typeof ( XmlQualifiedName ) )
1238+ var type = ValueType ;
1239+
1240+ if ( XmlSchemaType != null )
1241+ {
1242+ type = XmlSchemaType . Datatype . GetEffectiveType ( Configuration , Restrictions , attribute ) ;
1243+ }
1244+
1245+ if ( type == typeof ( XmlQualifiedName ) )
12271246 {
12281247 if ( defaultString . StartsWith ( "xs:" , StringComparison . OrdinalIgnoreCase ) )
12291248 {
@@ -1235,6 +1254,12 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
12351254 }
12361255 throw new NotSupportedException ( string . Format ( "Resolving default value {0} for QName not supported." , defaultString ) ) ;
12371256 }
1257+ else if ( type == typeof ( DateTime ) )
1258+ {
1259+ var rv = new CodeMethodInvokeExpression ( new CodeTypeReferenceExpression ( typeof ( DateTime ) ) , "Parse" , new CodePrimitiveExpression ( defaultString ) ) ;
1260+ return rv ;
1261+ }
1262+
12381263 return new CodePrimitiveExpression ( Convert . ChangeType ( defaultString , ValueType ) ) ;
12391264 }
12401265
0 commit comments