Skip to content

Commit 7541682

Browse files
authored
Improve ClassTemplateModel performance (#1786)
1 parent 6bc9b75 commit 7541682

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

src/NJsonSchema.CodeGeneration.CSharp/CSharpGenerator.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,18 @@ private CodeArtifact GenerateClass(JsonSchema schema, string typeName)
113113
{
114114
var model = new ClassTemplateModel(typeName, Settings, _resolver, schema, RootObject);
115115

116-
RenamePropertyWithSameNameAsClass(typeName, model.Properties);
116+
RenamePropertyWithSameNameAsClass(typeName, model._properties);
117117

118118
var template = Settings.TemplateFactory.CreateTemplate("CSharp", "Class", model);
119119
return new CodeArtifact(typeName, model.BaseClassName, CodeArtifactType.Class, CodeArtifactLanguage.CSharp, CodeArtifactCategory.Contract, template);
120120
}
121121

122-
private static void RenamePropertyWithSameNameAsClass(string typeName, IEnumerable<PropertyModel> properties)
122+
private static void RenamePropertyWithSameNameAsClass(string typeName, List<PropertyModel> properties)
123123
{
124-
var propertyModels = properties as PropertyModel[] ?? properties.ToArray();
125124
PropertyModel? propertyWithSameNameAsClass = null;
126-
foreach (var p in propertyModels)
125+
for (var i = 0; i < properties.Count; i++)
127126
{
127+
var p = properties[i];
128128
if (p.PropertyName == typeName)
129129
{
130130
propertyWithSameNameAsClass = p;
@@ -136,7 +136,7 @@ private static void RenamePropertyWithSameNameAsClass(string typeName, IEnumerab
136136
{
137137
var number = 1;
138138
var candidate = typeName + number;
139-
while (propertyModels.Any(p => p.PropertyName == candidate))
139+
while (properties.Exists(p => p.PropertyName == candidate))
140140
{
141141
number++;
142142
}

src/NJsonSchema.CodeGeneration.CSharp/Models/ClassTemplateModel.cs

+18-8
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public class ClassTemplateModel : ClassTemplateModelBase
1616
private readonly CSharpTypeResolver _resolver;
1717
private readonly JsonSchema _schema;
1818
private readonly CSharpGeneratorSettings _settings;
19+
internal readonly List<PropertyModel> _properties;
20+
private readonly List<PropertyModel> _allProperties;
1921

2022
/// <summary>Initializes a new instance of the <see cref="ClassTemplateModel"/> class.</summary>
2123
/// <param name="typeName">Name of the type.</param>
@@ -32,19 +34,27 @@ public ClassTemplateModel(string typeName, CSharpGeneratorSettings settings,
3234
_settings = settings;
3335

3436
ClassName = typeName;
35-
Properties = _schema.ActualProperties.Values
36-
.Where(p => !p.IsInheritanceDiscriminator)
37-
.Select(property => new PropertyModel(this, property, _resolver, _settings))
38-
.ToArray();
37+
38+
var actualProperties = _schema.ActualProperties;
39+
_properties = new List<PropertyModel>(actualProperties.Count);
40+
foreach (var property in actualProperties.Values)
41+
{
42+
if (!property.IsInheritanceDiscriminator)
43+
{
44+
_properties.Add(new PropertyModel(this, property, _resolver, _settings));
45+
}
46+
}
3947

4048
if (schema.InheritedSchema != null)
4149
{
4250
BaseClass = new ClassTemplateModel(BaseClassName!, settings, resolver, schema.InheritedSchema, rootObject);
43-
AllProperties = Properties.Concat(BaseClass.AllProperties).ToArray();
51+
_allProperties = new List<PropertyModel>(_properties.Count + BaseClass._allProperties.Count);
52+
_allProperties.AddRange(_properties);
53+
_allProperties.AddRange(BaseClass._allProperties);
4454
}
4555
else
4656
{
47-
AllProperties = Properties;
57+
_allProperties = _properties;
4858
}
4959
}
5060

@@ -87,10 +97,10 @@ public ClassTemplateModel(string typeName, CSharpGeneratorSettings settings,
8797
// string.Empty) : null;
8898

8999
/// <summary>Gets the property models.</summary>
90-
public IEnumerable<PropertyModel> Properties { get; }
100+
public IEnumerable<PropertyModel> Properties => _properties;
91101

92102
/// <summary>Gets the property models with inherited properties.</summary>
93-
public IEnumerable<PropertyModel> AllProperties { get; }
103+
public IEnumerable<PropertyModel> AllProperties => _allProperties;
94104

95105
/// <summary>Gets a value indicating whether the class has description.</summary>
96106
public bool HasDescription => _schema is not JsonSchemaProperty &&

0 commit comments

Comments
 (0)