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; }
}
}