From 790a656daf3dda03b1156f79551857d8fb12539e Mon Sep 17 00:00:00 2001 From: Michael Ganss Date: Tue, 5 Dec 2017 18:50:29 +0100 Subject: [PATCH] Fix #45 --- XmlSchemaClassGenerator/TypeModel.cs | 33 ++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/XmlSchemaClassGenerator/TypeModel.cs b/XmlSchemaClassGenerator/TypeModel.cs index 310aedd5..0d65ac92 100644 --- a/XmlSchemaClassGenerator/TypeModel.cs +++ b/XmlSchemaClassGenerator/TypeModel.cs @@ -87,6 +87,8 @@ public static IEnumerable GetComments(IEnumerable GetAllDerivedTypes() return allDerivedTypes; } + + public override CodeExpression GetDefaultValueFor(string defaultString) + { + if (BaseClass is SimpleModel) + { + string reference, val; + + using (var writer = new System.IO.StringWriter()) + { + CSharpProvider.GenerateCodeFromExpression(BaseClass.GetDefaultValueFor(defaultString), writer, new CodeGeneratorOptions()); + val = writer.ToString(); + } + + using (var writer = new System.IO.StringWriter()) + { + CSharpProvider.GenerateCodeFromExpression(new CodeTypeReferenceExpression(GetReferenceFor(null, false)), writer, new CodeGeneratorOptions()); + reference = writer.ToString(); + } + + var dv = new CodeSnippetExpression($"new { reference } {{ { Configuration.TextValuePropertyName } = { val } }};"); + return dv; + } + + return base.GetDefaultValueFor(defaultString); + } } public class PropertyModel @@ -609,7 +636,7 @@ public void AddInterfaceMembersTo(CodeTypeDeclaration typeDeclaration) { var defaultValueExpression = propertyType.GetDefaultValueFor(DefaultValue); - if (!(defaultValueExpression is CodeObjectCreateExpression)) + if ((defaultValueExpression is CodePrimitiveExpression) || (defaultValueExpression is CodeFieldReferenceExpression)) { var defaultValueAttribute = new CodeAttributeDeclaration(new CodeTypeReference(typeof(DefaultValueAttribute), Configuration.CodeTypeReferenceOptions), new CodeAttributeArgument(defaultValueExpression)); @@ -692,7 +719,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi if (IsNullable) { - if (!(defaultValueExpression is CodeObjectCreateExpression)) + if ((defaultValueExpression is CodePrimitiveExpression) || (defaultValueExpression is CodeFieldReferenceExpression)) { var defaultValueAttribute = new CodeAttributeDeclaration(new CodeTypeReference(typeof(DefaultValueAttribute), Configuration.CodeTypeReferenceOptions), new CodeAttributeArgument(defaultValueExpression)); @@ -1064,8 +1091,6 @@ public override CodeExpression GetDefaultValueFor(string defaultString) public class SimpleModel : TypeModel { - private static readonly CodeDomProvider CSharpProvider = CodeDomProvider.CreateProvider("CSharp"); - public Type ValueType { get; set; } public List Restrictions { get; private set; } public bool UseDataTypeAttribute { get; set; }