private Contracts.IGeneratedItem CreateModelFromContract(Type type, Common.UnitType unitType, Common.ItemType itemType) { type.CheckArgument(nameof(type)); var modelName = CreateModelNameFromInterface(type); var typeProperties = ContractHelper.GetAllProperties(type); var interfaces = GetInterfaces(type); var result = new Models.GeneratedItem(unitType, itemType) { FullName = CreateModelFullNameFromInterface(type), FileExtension = StaticLiterals.CSharpFileExtension, }; result.SubFilePath = $"{result.FullName}{result.FileExtension}"; CreateModelAttributes(type, result.Source); result.Add($"public partial class {modelName} : {type.FullName}"); result.Add("{"); result.AddRange(CreatePartialStaticConstrutor(modelName)); result.AddRange(CreatePartialConstrutor("public", modelName)); foreach (var item in ContractHelper.FilterPropertiesForGeneration(typeProperties)) { CreateModelPropertyAttributes(type, item, result.Source); result.AddRange(CreateProperty(item)); } result.AddRange(CreateCopyProperties(type)); foreach (var item in interfaces.Where(e => ContractHelper.HasCopyable(e))) { result.AddRange(CreateCopyProperties(item)); } result.AddRange(CreateFactoryMethods(type, false)); result.Add("}"); result.EnvelopeWithANamespace(CreateModelsNamespace(type), "using System;"); result.FormatCSharpCode(); return(result); }
public static IEnumerable <string> CreateModelFromInterface(Type type, Action <Type, List <string> > createAttributes = null, Action <Type, PropertyInfo, List <string> > createPropertyAttributes = null) { type.CheckArgument(nameof(type)); var result = new List <string>(); var entityName = CreateEntityNameFromInterface(type); var properties = ContractHelper.GetAllProperties(type); createAttributes?.Invoke(type, result); result.Add($"public partial class {entityName} : {type.FullName}"); result.Add("{"); result.AddRange(CreatePartialStaticConstrutor(entityName)); result.AddRange(CreatePartialConstrutor("public", entityName)); foreach (var item in ContractHelper.FilterPropertiesForGeneration(properties)) { createPropertyAttributes?.Invoke(type, item, result); result.AddRange(CreateProperty(item)); } result.AddRange(CreateCopyProperties(type)); result.AddRange(CreateFactoryMethods(type, false)); result.Add("}"); return(result); }
/// <summary> /// Diese Methode erstellt den Programmcode fuer das Vergleichen der Eigenschaften. /// </summary> /// <param name="type">Die Schnittstellen-Typ Information.</param> /// <returns>Die Equals-Methode als Text.</returns> internal static IEnumerable <string> CreateEquals(Type type) { type.CheckArgument(nameof(type)); var result = new List <string>(); var counter = 0; var properties = ContractHelper.GetAllProperties(type); var filteredProperties = ContractHelper.FilterPropertiesForGeneration(properties); if (filteredProperties.Any()) { result.Add($"public override bool Equals(object obj)"); result.Add("{"); result.Add($"if (obj is not {type.FullName} instance)"); result.Add("{"); result.Add("return false;"); result.Add("}"); result.Add("return base.Equals(instance) && Equals(instance);"); result.Add("}"); result.Add(string.Empty); result.Add($"protected bool Equals({type.FullName} other)"); result.Add("{"); result.Add("if (other == null)"); result.Add("{"); result.Add("return false;"); result.Add("}"); foreach (var pi in filteredProperties) { if (pi.CanRead) { var codeLine = counter == 0 ? "return " : " && "; if (pi.PropertyType.IsValueType) { codeLine += $"{pi.Name} == other.{pi.Name}"; } else { codeLine += $"IsEqualsWith({pi.Name}, other.{pi.Name})"; } result.Add(codeLine); counter++; } } if (counter > 0) { result[^ 1] = $"{result[^1]};";
private Contracts.IGeneratedItem CreateDelegateProperties(Type type, Type delegateType, string delegateObjectName, Common.UnitType unitType, Common.ItemType itemType) { type.CheckArgument(nameof(type)); delegateType.CheckArgument(nameof(delegateType)); var modelName = CreateModelNameFromInterface(type); var typeProperties = ContractHelper.GetAllProperties(delegateType); var result = new Models.GeneratedItem(unitType, itemType) { FullName = CreateModelFullNameFromInterface(type), FileExtension = StaticLiterals.CSharpFileExtension, }; result.SubFilePath = $"{result.FullName}{result.FileExtension}"; CreateModelAttributes(type, result.Source); result.Add($"public partial class {modelName}"); result.Add("{"); foreach (var item in ContractHelper.FilterPropertiesForGeneration(typeProperties)) { var propertyType = GetPropertyType(item); if (item.CanRead || item.CanWrite) { CreateModelPropertyAttributes(delegateType, item, result.Source); result.Add($"public {propertyType} {item.Name}"); result.Add("{"); if (item.CanRead) { result.Add($"get => {delegateObjectName}.{item.Name};"); } if (item.CanWrite) { result.Add($"set => {delegateObjectName}.{item.Name} = value;"); } result.Add("}"); } } result.Add("}"); result.EnvelopeWithANamespace(CreateModelsNamespace(type), "using System;"); result.FormatCSharpCode(); return(result); }