@@ -185,7 +185,7 @@ public virtual CodeTypeReference GetReferenceFor(NamespaceModel referencingNames
185
185
return new CodeTypeReference ( name ) ;
186
186
}
187
187
188
- public virtual CodeExpression GetDefaultValueFor ( string defaultString )
188
+ public virtual CodeExpression GetDefaultValueFor ( string defaultString , bool attribute )
189
189
{
190
190
throw new NotSupportedException ( string . Format ( "Getting default value for {0} not supported." , defaultString ) ) ;
191
191
}
@@ -398,13 +398,13 @@ public override CodeTypeDeclaration Generate()
398
398
399
399
if ( IsMixed && ( BaseClass == null || ( BaseClass is ClassModel && ! AllBaseClasses . Any ( b => b . IsMixed ) ) ) )
400
400
{
401
- var propName = "Text" ;
401
+ var propName = "Text" ;
402
402
403
403
// To not collide with any existing members
404
404
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
+ }
408
408
var text = new CodeMemberField ( typeof ( string [ ] ) , propName ) ;
409
409
// hack to generate automatic property
410
410
text . Name += " { get; set; }" ;
@@ -456,7 +456,7 @@ public List<ClassModel> GetAllDerivedTypes()
456
456
return allDerivedTypes ;
457
457
}
458
458
459
- public override CodeExpression GetDefaultValueFor ( string defaultString )
459
+ public override CodeExpression GetDefaultValueFor ( string defaultString , bool attribute )
460
460
{
461
461
var rootClass = AllBaseTypes . LastOrDefault ( ) ;
462
462
@@ -466,7 +466,7 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
466
466
467
467
using ( var writer = new System . IO . StringWriter ( ) )
468
468
{
469
- CSharpProvider . GenerateCodeFromExpression ( rootClass . GetDefaultValueFor ( defaultString ) , writer , new CodeGeneratorOptions ( ) ) ;
469
+ CSharpProvider . GenerateCodeFromExpression ( rootClass . GetDefaultValueFor ( defaultString , attribute ) , writer , new CodeGeneratorOptions ( ) ) ;
470
470
val = writer . ToString ( ) ;
471
471
}
472
472
@@ -480,7 +480,7 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
480
480
return dv ;
481
481
}
482
482
483
- return base . GetDefaultValueFor ( defaultString ) ;
483
+ return base . GetDefaultValueFor ( defaultString , attribute ) ;
484
484
}
485
485
}
486
486
@@ -658,8 +658,8 @@ private CodeTypeReference TypeReference
658
658
{
659
659
get
660
660
{
661
- return PropertyType . GetReferenceFor ( OwningType . Namespace ,
662
- collection : IsCollection || IsArray || ( IsList && IsAttribute ) ,
661
+ return PropertyType . GetReferenceFor ( OwningType . Namespace ,
662
+ collection : IsCollection || IsArray || ( IsList && IsAttribute ) ,
663
663
attribute : IsAttribute ) ;
664
664
}
665
665
}
@@ -680,6 +680,20 @@ private void AddDocs(CodeTypeMember member)
680
680
member . Comments . AddRange ( DocumentationModel . GetComments ( docs ) . ToArray ( ) ) ;
681
681
}
682
682
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
+
683
697
public void AddInterfaceMembersTo ( CodeTypeDeclaration typeDeclaration )
684
698
{
685
699
CodeTypeMember member ;
@@ -706,12 +720,11 @@ public void AddInterfaceMembersTo(CodeTypeDeclaration typeDeclaration)
706
720
707
721
if ( DefaultValue != null && IsNullable )
708
722
{
709
- var defaultValueExpression = propertyType . GetDefaultValueFor ( DefaultValue ) ;
723
+ var defaultValueExpression = propertyType . GetDefaultValueFor ( DefaultValue , IsAttribute ) ;
710
724
711
725
if ( ( defaultValueExpression is CodePrimitiveExpression ) || ( defaultValueExpression is CodeFieldReferenceExpression ) )
712
726
{
713
- var defaultValueAttribute = new CodeAttributeDeclaration ( new CodeTypeReference ( typeof ( DefaultValueAttribute ) , Configuration . CodeTypeReferenceOptions ) ,
714
- new CodeAttributeArgument ( defaultValueExpression ) ) ;
727
+ var defaultValueAttribute = CreateDefaultValueAttribute ( typeReference , defaultValueExpression ) ;
715
728
member . CustomAttributes . Add ( defaultValueAttribute ) ;
716
729
}
717
730
}
@@ -759,7 +772,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
759
772
else
760
773
member = new CodeMemberField ( typeReference , propertyName ) ;
761
774
762
- var isPrivateSetter = IsCollection || isArray ;
775
+ var isPrivateSetter = IsCollection || isArray || ( IsList && IsAttribute ) ;
763
776
764
777
if ( requiresBackingField )
765
778
{
@@ -775,7 +788,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
775
788
}
776
789
else
777
790
{
778
- var defaultValueExpression = propertyType . GetDefaultValueFor ( DefaultValue ) ;
791
+ var defaultValueExpression = propertyType . GetDefaultValueFor ( DefaultValue , IsAttribute ) ;
779
792
backingField . InitExpression = defaultValueExpression ;
780
793
781
794
if ( IsNillableValueType )
@@ -791,8 +804,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
791
804
792
805
if ( IsNullable && ( ( defaultValueExpression is CodePrimitiveExpression ) || ( defaultValueExpression is CodeFieldReferenceExpression ) ) )
793
806
{
794
- var defaultValueAttribute = new CodeAttributeDeclaration ( new CodeTypeReference ( typeof ( DefaultValueAttribute ) , Configuration . CodeTypeReferenceOptions ) ,
795
- new CodeAttributeArgument ( defaultValueExpression ) ) ;
807
+ var defaultValueAttribute = CreateDefaultValueAttribute ( typeReference , defaultValueExpression ) ;
796
808
member . CustomAttributes . Add ( defaultValueAttribute ) ;
797
809
}
798
810
}
@@ -1139,7 +1151,7 @@ public override CodeTypeDeclaration Generate()
1139
1151
return enumDeclaration ;
1140
1152
}
1141
1153
1142
- public override CodeExpression GetDefaultValueFor ( string defaultString )
1154
+ public override CodeExpression GetDefaultValueFor ( string defaultString , bool attribute )
1143
1155
{
1144
1156
return new CodeFieldReferenceExpression ( new CodeTypeReferenceExpression ( GetReferenceFor ( referencingNamespace : null ) ) ,
1145
1157
Values . First ( v => v . Value == defaultString ) . Name ) ;
@@ -1221,9 +1233,16 @@ public override CodeTypeReference GetReferenceFor(NamespaceModel referencingName
1221
1233
return new CodeTypeReference ( type , Configuration . CodeTypeReferenceOptions ) ;
1222
1234
}
1223
1235
1224
- public override CodeExpression GetDefaultValueFor ( string defaultString )
1236
+ public override CodeExpression GetDefaultValueFor ( string defaultString , bool attribute )
1225
1237
{
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 ) )
1227
1246
{
1228
1247
if ( defaultString . StartsWith ( "xs:" , StringComparison . OrdinalIgnoreCase ) )
1229
1248
{
@@ -1235,6 +1254,12 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
1235
1254
}
1236
1255
throw new NotSupportedException ( string . Format ( "Resolving default value {0} for QName not supported." , defaultString ) ) ;
1237
1256
}
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
+
1238
1263
return new CodePrimitiveExpression ( Convert . ChangeType ( defaultString , ValueType ) ) ;
1239
1264
}
1240
1265
0 commit comments