From 60935d9d6fe831ee4832835bb1188f54eecb61f0 Mon Sep 17 00:00:00 2001 From: David Gardiner Date: Thu, 30 Mar 2017 15:49:41 +1030 Subject: [PATCH 1/4] Implement #21 - Add MemberVisitor delegate as an API for inspecting and/or modifying each generated member. --- XmlSchemaClassGenerator/Generator.cs | 9 +++++++++ XmlSchemaClassGenerator/GeneratorConfiguration.cs | 5 +++++ XmlSchemaClassGenerator/TypeModel.cs | 2 ++ 3 files changed, 16 insertions(+) diff --git a/XmlSchemaClassGenerator/Generator.cs b/XmlSchemaClassGenerator/Generator.cs index 7d518d9a..7c531ad7 100644 --- a/XmlSchemaClassGenerator/Generator.cs +++ b/XmlSchemaClassGenerator/Generator.cs @@ -145,6 +145,15 @@ public CodeTypeReferenceOptions CodeTypeReferenceOptions set { _configuration.CodeTypeReferenceOptions = value; } } + /// + /// Optional delegate that is called for each generated type member + /// + public Action MemberVisitor + { + get { return _configuration.MemberVisitor; } + set { _configuration.MemberVisitor = value;} + } + private readonly XmlSchemaSet Set = new XmlSchemaSet(); private Dictionary AttributeGroups; private Dictionary Groups; diff --git a/XmlSchemaClassGenerator/GeneratorConfiguration.cs b/XmlSchemaClassGenerator/GeneratorConfiguration.cs index 4adbb36f..3f3b5de0 100644 --- a/XmlSchemaClassGenerator/GeneratorConfiguration.cs +++ b/XmlSchemaClassGenerator/GeneratorConfiguration.cs @@ -139,5 +139,10 @@ public void WriteLog(string message) Log(message); } } + + /// + /// Optional delegate that is called for each generated type member + /// + public Action MemberVisitor { get; set; } } } diff --git a/XmlSchemaClassGenerator/TypeModel.cs b/XmlSchemaClassGenerator/TypeModel.cs index 8c834163..79363e35 100644 --- a/XmlSchemaClassGenerator/TypeModel.cs +++ b/XmlSchemaClassGenerator/TypeModel.cs @@ -837,6 +837,8 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi { member.CustomAttributes.Add(notMappedAttribute); } + + Configuration.MemberVisitor(member, this); } private IEnumerable GetAttributes(bool isArray) From 621c558304776a4281bdd05c51fa4fea44f39dd1 Mon Sep 17 00:00:00 2001 From: David Gardiner Date: Thu, 30 Mar 2017 16:48:00 +1030 Subject: [PATCH 2/4] Also provide hooks for Specified properties --- XmlSchemaClassGenerator/TypeModel.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/XmlSchemaClassGenerator/TypeModel.cs b/XmlSchemaClassGenerator/TypeModel.cs index 79363e35..541d5e01 100644 --- a/XmlSchemaClassGenerator/TypeModel.cs +++ b/XmlSchemaClassGenerator/TypeModel.cs @@ -696,6 +696,13 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi specifiedMember.Comments.AddRange(DocumentationModel.GetComments(specifiedDocs).ToArray()); typeDeclaration.Members.Add(specifiedMember); + var specifiedMemberPropertyModel = new PropertyModel(Configuration) + { + Name = specifiedName + "Specified" + }; + + Configuration.MemberVisitor(specifiedMember, specifiedMemberPropertyModel); + if (Configuration.GenerateNullables) { // public X? Name @@ -789,6 +796,8 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi new DocumentationModel { Language = "de", Text = string.Format("Ruft einen Wert ab, der angibt, ob die {0}-Collection leer ist.", Name) } }; specifiedProperty.Comments.AddRange(DocumentationModel.GetComments(specifiedDocs).ToArray()); + Configuration.MemberVisitor(specifiedProperty, this); + typeDeclaration.Members.Add(specifiedProperty); } From 5d781fdd4262c1f3dfb726b1a60d85bb6155e2b1 Mon Sep 17 00:00:00 2001 From: David Gardiner Date: Wed, 5 Apr 2017 12:10:05 +0930 Subject: [PATCH 3/4] Add default delegate --- XmlSchemaClassGenerator/GeneratorConfiguration.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/XmlSchemaClassGenerator/GeneratorConfiguration.cs b/XmlSchemaClassGenerator/GeneratorConfiguration.cs index 3f3b5de0..8c9a38a7 100644 --- a/XmlSchemaClassGenerator/GeneratorConfiguration.cs +++ b/XmlSchemaClassGenerator/GeneratorConfiguration.cs @@ -33,6 +33,7 @@ public GeneratorConfiguration() DataAnnotationMode = DataAnnotationMode.All; GenerateSerializableAttribute = GenerateDesignerCategoryAttribute = true; CollectionType = typeof(Collection<>); + MemberVisitor = (member, model) => { }; } /// From 5fbae58f9c19adff15fab481fdca150f995f11d4 Mon Sep 17 00:00:00 2001 From: David Gardiner Date: Wed, 5 Apr 2017 12:35:33 +0930 Subject: [PATCH 4/4] Test MemborVisitor --- XmlSchemaClassGenerator.Tests/XmlTests.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index ebd9d31d..caaa5cf1 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -39,7 +39,7 @@ private Assembly Compile(string name, string pattern, Generator generatorPrototy GenerateDesignerCategoryAttribute = false, EntityFramework = false, GenerateInterfaces = true, - NamespacePrefix = name, + NamespacePrefix = name }; var gen = new Generator @@ -52,7 +52,8 @@ private Assembly Compile(string name, string pattern, Generator generatorPrototy DataAnnotationMode = generatorPrototype.DataAnnotationMode, GenerateDesignerCategoryAttribute = generatorPrototype.GenerateDesignerCategoryAttribute, EntityFramework = generatorPrototype.EntityFramework, - GenerateInterfaces = generatorPrototype.GenerateInterfaces + GenerateInterfaces = generatorPrototype.GenerateInterfaces, + MemberVisitor = generatorPrototype.MemberVisitor }; var files = Glob.Glob.ExpandNames(pattern); @@ -103,7 +104,8 @@ public void CanDeserializeSampleXml() { EntityFramework = true, DataAnnotationMode = DataAnnotationMode.All, - NamespaceProvider = new Dictionary { { new NamespaceKey("http://wadl.dev.java.net/2009/02"), "Wadl" } }.ToNamespaceProvider(new GeneratorConfiguration { NamespacePrefix = "Wadl" }.NamespaceProvider.GenerateNamespace) + NamespaceProvider = new Dictionary { { new NamespaceKey("http://wadl.dev.java.net/2009/02"), "Wadl" } }.ToNamespaceProvider(new GeneratorConfiguration { NamespacePrefix = "Wadl" }.NamespaceProvider.GenerateNamespace), + MemberVisitor = (member, model) => { } }); TestSamples("Wadl", WadlPattern); Compile("IS24ImmoTransfer", IS24ImmoTransferPattern);