From db7384ae74a4e61acf4266395339bb70f787e1e8 Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Thu, 8 May 2025 11:17:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=A2=9E=E9=87=8F=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ComplexTypeSourceAnalyzers.cs | 164 ++++++++---------- .../Provider/IoTDBProvider.cs | 34 ++-- .../Samples/SampleAppService.cs | 2 +- .../Ammeters/ElectricityMeterTreeModel.cs | 4 +- .../ISourceEntityAccessor.cs | 2 +- 5 files changed, 96 insertions(+), 110 deletions(-) diff --git a/modules/JiShe.CollectBus.Analyzers/ComplexTypeSourceAnalyzers.cs b/modules/JiShe.CollectBus.Analyzers/ComplexTypeSourceAnalyzers.cs index befb833..2f943d8 100644 --- a/modules/JiShe.CollectBus.Analyzers/ComplexTypeSourceAnalyzers.cs +++ b/modules/JiShe.CollectBus.Analyzers/ComplexTypeSourceAnalyzers.cs @@ -2,6 +2,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics; using System.Linq; using System.Text; @@ -105,7 +106,7 @@ namespace JiShe.CollectBus.IncrementalGenerator Location.None)); continue; } - + var code3 = BuildAccessorsForSourceEntity(classSymbol, compilation, processedTypes); context.AddSource($"{classSymbol.Name}Accessor.g.cs", code3); } @@ -113,7 +114,7 @@ namespace JiShe.CollectBus.IncrementalGenerator // 生成工厂注册代码 context.AddSource("SourceEntityAccessorFactory.g.cs", BuildFactoryCode()); } - + /// /// 获取泛型参数 /// @@ -125,8 +126,8 @@ namespace JiShe.CollectBus.IncrementalGenerator var parameters = symbol.TypeParameters.Select(t => t.Name); return $"<{string.Join(", ", parameters)}>"; } - - + + /// /// 生成标准属性的访问器 /// @@ -143,7 +144,7 @@ namespace JiShe.CollectBus.IncrementalGenerator code.AppendLine($" public static void Set{prop.Name}({parentType} obj, {propType.ToDisplayString()} value) => obj.{prop.Name} = value;"); } } - + /// /// 构建实体访问器代码(支持泛型) @@ -179,21 +180,22 @@ namespace JiShe.CollectBus.IncrementalGenerator $": ISourceEntityAccessor<{classSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}>"); code.AppendLine("{"); - + var propList = GetAllPropertiesInHierarchy(classSymbol); foreach (var prop in propList) { // 安全类型转换 if (prop.Type is not ITypeSymbol propType) continue; + + if (propType is INamedTypeSymbol namedType) + { + GenerateStandardAccessors(prop, namedType, code); + } if (propType is INamedTypeSymbol { IsTupleType: true } tupleType) { - GenerateTupleAccessors(prop, tupleType, code, classSymbol); - } - else if (propType is INamedTypeSymbol namedType) - { - GenerateStandardAccessors(prop, namedType, code); + GenerateTupleAccessors(prop, tupleType, code); } } @@ -201,70 +203,57 @@ namespace JiShe.CollectBus.IncrementalGenerator GeneratePropertyListForSourceEntity(propList, code, compilation, classSymbol); //生成当前类属性信息集合 - GeneratePropertyInfoListForSourceEntity( - propList, - code, - compilation, - classSymbol); + GenerateEntityMemberInfoList(propList, code, compilation, classSymbol); //生成当前类属性访问 - GetGeneratePropertyValueForSourceEntity( - propList, - code, - compilation, - classSymbol); + GetGeneratePropertyValueForSourceEntity(propList, code, compilation, classSymbol); //生成当前类属性设置 - SetGeneratePropertyValueForSourceEntity( - propList, - code, - compilation, - classSymbol); - + SetGeneratePropertyValueForSourceEntity(propList, code, compilation, classSymbol); + code.AppendLine("}"); return code.ToString(); } - /// - /// 生成泛型ValueTuple 元组访问器 - /// private static void GenerateTupleAccessors( - IPropertySymbol prop, - INamedTypeSymbol tupleType, - StringBuilder code, - INamedTypeSymbol classSymbol) + IPropertySymbol prop, + INamedTypeSymbol tupleType, + StringBuilder code) { - var parentType = classSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + var parentType = prop.ContainingType.ToDisplayString(); var tupleElements = tupleType.TupleElements; for (int i = 0; i < tupleElements.Length; i++) { var element = tupleElements[i]; - var elementType = element.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + var elementType = element.Type.ToDisplayString(); var elementName = element.Name; - // Getter保持不变 - code.AppendLine( - $" public static {elementType} Get{prop.Name}_{elementName}" + - $"({parentType} obj) => obj.{prop.Name}.{elementName};"); + // Getter + code.AppendLine($"public static {elementType} Get{prop.Name}_{elementName}({parentType} obj) => obj.{prop.Name}.{elementName};"); - // Setter修复:使用元组字面量 + // Setter if (prop.SetMethod != null) { - var valueExpressions = tupleElements.Select((e, idx) => - idx == i ? "value" : $"obj.{prop.Name}.{e.Name}" - ).ToList(); - - // 关键修复:生成正确的元组字面量表达式 - code.AppendLine( - $" public static void Set{prop.Name}_{elementName}" + - $"({parentType} obj, {elementType} value) => " + - $"obj.{prop.Name} = ({string.Join(", ", valueExpressions)});"); + code.AppendLine($"public static void Set{prop.Name}_{elementName}({parentType} obj, {elementType} value) => obj.{prop.Name} = ({string.Join(", ", GetTupleElements(prop.Name, tupleElements, i))});"); } } } + private static IEnumerable GetTupleElements( + string propName, + ImmutableArray elements, + int targetIndex) + { + for (int i = 0; i < elements.Length; i++) + { + yield return i == targetIndex + ? "value" + : $"obj.{propName}.{elements[i].Name}"; + } + } + /// /// 处理System.Tuple类型的访问器生成 /// @@ -370,6 +359,10 @@ namespace JiShe.CollectBus.IncrementalGenerator foreach (var prop in propList) { + code.AppendLine( + $" \"{prop.Name}\" => " + + $"Get{prop.Name}(targetEntity),"); + if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType) { foreach (var element in tupleType.TupleElements) @@ -379,12 +372,7 @@ namespace JiShe.CollectBus.IncrementalGenerator $"Get{prop.Name}_{element.Name}(targetEntity),"); } } - else - { - code.AppendLine( - $" \"{prop.Name}\" => " + - $"Get{prop.Name}(targetEntity),"); - } + } code.AppendLine(" _ => throw new ArgumentException($\"Unknown property: {propertyName}\")"); @@ -412,6 +400,12 @@ namespace JiShe.CollectBus.IncrementalGenerator foreach (var prop in propList) { + var propType = prop.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + code.AppendLine($" case \"{prop.Name}\":"); + code.AppendLine($" Set{prop.Name}("); + code.AppendLine($" targetEntity, ({propType})value);"); + code.AppendLine(" break;"); + if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType) { foreach (var element in tupleType.TupleElements) @@ -422,15 +416,7 @@ namespace JiShe.CollectBus.IncrementalGenerator code.AppendLine($" targetEntity, ({elementType})value);"); code.AppendLine(" break;"); } - } - else if (prop.SetMethod != null) - { - var propType = prop.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); - code.AppendLine($" case \"{prop.Name}\":"); - code.AppendLine($" Set{prop.Name}("); - code.AppendLine($" targetEntity, ({propType})value);"); - code.AppendLine(" break;"); - } + } } code.AppendLine(" default:"); @@ -458,7 +444,7 @@ namespace JiShe.CollectBus.IncrementalGenerator foreach (var prop in propList) { if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType) - { + { foreach (var element in tupleType.TupleElements) { tempPropList.Add($"\"{prop.Name}.{element.Name}\""); @@ -477,52 +463,52 @@ namespace JiShe.CollectBus.IncrementalGenerator /// - /// 生成当前类属性信息集合(支持嵌套元组) + /// 生成当前类属性信息集合 /// - private static void GeneratePropertyInfoListForSourceEntity( + private static void GenerateEntityMemberInfoList( IEnumerable propList, StringBuilder code, Compilation compilation, INamedTypeSymbol classSymbol) { - code.AppendLine(" public List PropertyInfoList { get; } = new List"); + code.AppendLine(" public List MemberList { get; } = new()"); code.AppendLine(" {"); var initializerLines = new List(); - + var index = 0; foreach (var prop in propList) { - AddPropertyInitializer(classSymbol, prop, initializerLines); + var propType = prop.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + var parentType = prop.ContainingType.ToDisplayString(); + // 主属性 + initializerLines.Add( + $"new EntityMemberInfo(" + + $"\"{prop.Name}\", " + + $"typeof({parentType}), " + + $"(e) => Get{prop.Name}(({parentType})e), " + + $"(e, v) => Set{prop.Name}(({parentType})e, ({propType})v))"); + // 元组元素 if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType) { foreach (var element in tupleType.TupleElements) { - //使用GetField代替GetProperty - var tupleTypeName = tupleType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + var elementType = element.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + var elementName = element.Name; + initializerLines.Add( - $"typeof({tupleTypeName}).GetField(\"{element.Name}\") ?? " + - $"throw new InvalidOperationException(\"Tuple field {element.Name} not found\")"); + $"new EntityMemberInfo(" + + $"\"{prop.Name}.{elementName}\", " + + $"typeof({elementType}), " + + $"(e) => Get{prop.Name}_{elementName}(({parentType})e), " + + $"(e, v) => Set{prop.Name}_{elementName}(({parentType})e, ({elementType})v))"); } } } code.AppendLine(string.Join(",\n", initializerLines)); code.AppendLine(" };"); - } - - private static void AddPropertyInitializer( - INamedTypeSymbol classSymbol, - IPropertySymbol prop, - List initializerLines) - { - var classType = classSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); - initializerLines.Add( - $"typeof({classType}).GetProperty(\"{prop.Name}\", " + - "System.Reflection.BindingFlags.Public | " + - "System.Reflection.BindingFlags.Instance) ?? " + - $"throw new InvalidOperationException(\"Property {prop.Name} not found\")"); - } + } } } \ No newline at end of file diff --git a/modules/JiShe.CollectBus.IoTDB/Provider/IoTDBProvider.cs b/modules/JiShe.CollectBus.IoTDB/Provider/IoTDBProvider.cs index 83040fe..0047122 100644 --- a/modules/JiShe.CollectBus.IoTDB/Provider/IoTDBProvider.cs +++ b/modules/JiShe.CollectBus.IoTDB/Provider/IoTDBProvider.cs @@ -635,11 +635,11 @@ namespace JiShe.CollectBus.IoTDB.Provider { var columns = new List(); - foreach (var prop in accessor.PropertyInfoList) + foreach (var prop in accessor.MemberList) { string typeName = string.Empty; - Type declaredType = prop.PropertyType; + Type declaredType = prop.Type; // 处理可空类型 if (declaredType.IsGenericType && declaredType.GetGenericTypeDefinition() == typeof(Nullable<>)) { @@ -652,25 +652,25 @@ namespace JiShe.CollectBus.IoTDB.Provider } //先获取Tag标签和属性标签 - ColumnInfo? column = prop.GetCustomAttribute() is not null ? new ColumnInfo( - name: prop.Name, + ColumnInfo? column = declaredType.GetCustomAttribute() is not null ? new ColumnInfo( + name: prop.Path, category: ColumnCategory.TAG, dataType: GetDataTypeFromTypeName(typeName), false - ) : prop.GetCustomAttribute() is not null ? new ColumnInfo( - prop.Name, + ) : declaredType.GetCustomAttribute() is not null ? new ColumnInfo( + prop.Path, ColumnCategory.ATTRIBUTE, GetDataTypeFromTypeName(typeName), false - ) : prop.GetCustomAttribute() is not null ? new ColumnInfo( - prop.Name, + ) : declaredType.GetCustomAttribute() is not null ? new ColumnInfo( + prop.Path, ColumnCategory.FIELD, GetDataTypeFromTypeName(typeName), false) : null; //最先检查是不是单侧点模式 - SingleMeasuringAttribute singleMeasuringAttribute = prop.GetCustomAttribute(); + SingleMeasuringAttribute singleMeasuringAttribute = declaredType.GetCustomAttribute(); if (singleMeasuringAttribute != null && column == null) { @@ -679,15 +679,15 @@ namespace JiShe.CollectBus.IoTDB.Provider //只有一个Filed字段。 //MeasuringName 默认为 SingleMeasuringAttribute.FieldName,以便于在获取对应的Value的时候重置为 Item1 的值。 - Type tupleType = prop.PropertyType; - Type[] tupleArgs = tupleType.GetGenericArguments(); + //Type tupleType = prop.PropertyType; + //Type[] tupleArgs = tupleType.GetGenericArguments(); - column = new ColumnInfo( - singleMeasuringAttribute.FieldName, - ColumnCategory.FIELD, - GetDataTypeFromTypeName(tupleArgs[1].Name), - true - ); + //column = new ColumnInfo( + // singleMeasuringAttribute.FieldName, + // ColumnCategory.FIELD, + // GetDataTypeFromTypeName(tupleArgs[1].Name), + // true + //); } if (column.HasValue) diff --git a/services/JiShe.CollectBus.Application/Samples/SampleAppService.cs b/services/JiShe.CollectBus.Application/Samples/SampleAppService.cs index 17c8a6e..e395160 100644 --- a/services/JiShe.CollectBus.Application/Samples/SampleAppService.cs +++ b/services/JiShe.CollectBus.Application/Samples/SampleAppService.cs @@ -75,7 +75,7 @@ public class SampleAppService : CollectBusAppService, ISampleAppService, IKafkaS //ElectricityMeterTreeModelAccessor. //TableModelSingleMeasuringEntityExtension - //TableModelSingleMeasuringEntityAccessor.GetSystemName(meter); + //TableModelSingleMeasuringEntityAccessor.GetSystemName(meter); await _iotDBProvider.InsertAsync(meter); } diff --git a/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeterTreeModel.cs b/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeterTreeModel.cs index 38d3ee6..982c144 100644 --- a/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeterTreeModel.cs +++ b/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeterTreeModel.cs @@ -32,11 +32,11 @@ namespace JiShe.CollectBus.Ammeters public double Current { get; set; } [FIELDColumn] - public double Power => Voltage * Current; + public double Power { get; set; } [FIELDColumn] public double? Currentd { get; set; } - public Tuple TupleData { get; set;} + public ValueTuple TupleData { get; set; } } } diff --git a/shared/JiShe.CollectBus.Analyzers.Shared/ISourceEntityAccessor.cs b/shared/JiShe.CollectBus.Analyzers.Shared/ISourceEntityAccessor.cs index 5e67826..79df535 100644 --- a/shared/JiShe.CollectBus.Analyzers.Shared/ISourceEntityAccessor.cs +++ b/shared/JiShe.CollectBus.Analyzers.Shared/ISourceEntityAccessor.cs @@ -31,6 +31,6 @@ namespace JiShe.CollectBus.Analyzers.Shared /// /// 属性信息集合 /// - List PropertyInfoList { get; } + List MemberList { get; } } }