diff --git a/modules/JiShe.CollectBus.Analyzers/ComplexTypeSourceAnalyzers.cs b/modules/JiShe.CollectBus.Analyzers/ComplexTypeSourceAnalyzers.cs index 2f943d8..15179af 100644 --- a/modules/JiShe.CollectBus.Analyzers/ComplexTypeSourceAnalyzers.cs +++ b/modules/JiShe.CollectBus.Analyzers/ComplexTypeSourceAnalyzers.cs @@ -183,6 +183,9 @@ namespace JiShe.CollectBus.IncrementalGenerator var propList = GetAllPropertiesInHierarchy(classSymbol); + //类名称 + code.AppendLine($" public string EntityName {{get;}} = \"{classSymbol.Name}\";"); + foreach (var prop in propList) { // 安全类型转换 @@ -216,6 +219,12 @@ namespace JiShe.CollectBus.IncrementalGenerator return code.ToString(); } + /// + /// 生成ValueTuple元组属性访问器 + /// + /// + /// + /// private static void GenerateTupleAccessors( IPropertySymbol prop, INamedTypeSymbol tupleType, @@ -291,7 +300,7 @@ namespace JiShe.CollectBus.IncrementalGenerator } } } - + /// /// 增强的工厂类实现 /// @@ -466,30 +475,48 @@ namespace JiShe.CollectBus.IncrementalGenerator /// 生成当前类属性信息集合 /// private static void GenerateEntityMemberInfoList( - IEnumerable propList, - StringBuilder code, - Compilation compilation, - INamedTypeSymbol classSymbol) + IEnumerable propList, + StringBuilder code, + Compilation compilation, + INamedTypeSymbol classSymbol) { - code.AppendLine(" public List MemberList { get; } = new()"); + code.AppendLine(" public List MemberList { get; } = new()"); code.AppendLine(" {"); var initializerLines = new List(); - var index = 0; foreach (var prop in propList) { var propType = prop.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); var parentType = prop.ContainingType.ToDisplayString(); - // 主属性 - initializerLines.Add( + + // 处理主属性 + var propAttributes = prop.GetAttributes() + .Where(a => !IsCompilerGeneratedAttribute(a)) + .ToList(); + + var attributeInitializers = propAttributes + .Select(GenerateAttributeInitializer) + .Where(s => !string.IsNullOrEmpty(s)); + + var mainMember = new StringBuilder(); + mainMember.Append( $"new EntityMemberInfo(" + $"\"{prop.Name}\", " + - $"typeof({parentType}), " + + $"typeof({propType}), " + $"(e) => Get{prop.Name}(({parentType})e), " + $"(e, v) => Set{prop.Name}(({parentType})e, ({propType})v))"); - // 元组元素 + if (attributeInitializers.Any()) + { + mainMember.AppendLine(); + mainMember.Append(" { CustomAttributes = new List"); + mainMember.Append($" {{ {string.Join(", ", attributeInitializers)} }} }}"); + } + + initializerLines.Add(mainMember.ToString()); + + // 处理元组元素(假设不需要处理元组元素的特性) if (prop.Type is INamedTypeSymbol { IsTupleType: true } tupleType) { foreach (var element in tupleType.TupleElements) @@ -509,6 +536,90 @@ namespace JiShe.CollectBus.IncrementalGenerator code.AppendLine(string.Join(",\n", initializerLines)); code.AppendLine(" };"); - } + } + + + private static string GenerateAttributeInitializer(AttributeData attribute) + { + if (attribute.AttributeClass == null) + return string.Empty; + + var attributeClass = attribute.AttributeClass.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + var args = attribute.ConstructorArguments; + var namedArgs = attribute.NamedArguments; + + var parameters = new List(); + foreach (var arg in args) + { + parameters.Add(ConvertTypedConstantToCode(arg)); + } + + var constructorArgs = string.Join(", ", parameters); + + var initializer = new StringBuilder(); + initializer.Append($"new {attributeClass}({constructorArgs})"); + + if (namedArgs.Any()) + { + initializer.Append(" { "); + var namedArgsList = namedArgs.Select(n => $"{n.Key} = {ConvertTypedConstantToCode(n.Value)}"); + initializer.Append(string.Join(", ", namedArgsList)); + initializer.Append(" }"); + } + + return initializer.ToString(); + } + + private static string ConvertTypedConstantToCode(TypedConstant constant) + { + if (constant.IsNull) + return "null"; + + switch (constant.Kind) + { + case TypedConstantKind.Array: + var elements = constant.Values.Select(ConvertTypedConstantToCode); + return $"new[] {{ {string.Join(", ", elements)} }}"; + case TypedConstantKind.Type: + var typeSymbol = (ITypeSymbol)constant.Value!; + return $"typeof({typeSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)})"; + case TypedConstantKind.Enum: + return ConvertEnumTypedConstant(constant); + default: + return ConvertPrimitiveConstant(constant); + } + } + + private static string ConvertEnumTypedConstant(TypedConstant constant) + { + var enumType = constant.Type!; + var enumValue = constant.Value!; + var enumTypeName = enumType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + + foreach (var member in enumType.GetMembers().OfType()) + { + if (member.ConstantValue != null && member.ConstantValue.Equals(enumValue)) + return $"{enumTypeName}.{member.Name}"; + } + + return $"({enumTypeName})({enumValue})"; + } + + private static string ConvertPrimitiveConstant(TypedConstant constant) + { + var value = constant.Value!; + return value switch + { + string s => $"\"{s}\"", + char c => $"'{c}'", + bool b => b ? "true" : "false", + _ => value.ToString() + }; + } + + private static bool IsCompilerGeneratedAttribute(AttributeData attribute) + { + return attribute.AttributeClass?.ToDisplayString() == "System.Runtime.CompilerServices.CompilerGeneratedAttribute"; + } } } \ No newline at end of file diff --git a/modules/JiShe.CollectBus.IoTDB/Attribute/ATTRIBUTEColumnAttribute.cs b/modules/JiShe.CollectBus.IoTDB/Attributes/ATTRIBUTEColumnAttribute.cs similarity index 83% rename from modules/JiShe.CollectBus.IoTDB/Attribute/ATTRIBUTEColumnAttribute.cs rename to modules/JiShe.CollectBus.IoTDB/Attributes/ATTRIBUTEColumnAttribute.cs index d188c36..7ef13f3 100644 --- a/modules/JiShe.CollectBus.IoTDB/Attribute/ATTRIBUTEColumnAttribute.cs +++ b/modules/JiShe.CollectBus.IoTDB/Attributes/ATTRIBUTEColumnAttribute.cs @@ -1,4 +1,4 @@ -namespace JiShe.CollectBus.IoTDB.Attribute +namespace JiShe.CollectBus.IoTDB.Attributes { /// /// Column分类标记特性(ATTRIBUTE字段),也就是属性字段 diff --git a/modules/JiShe.CollectBus.IoTDB/Attribute/EntityTypeAttribute.cs b/modules/JiShe.CollectBus.IoTDB/Attributes/EntityTypeAttribute.cs similarity index 90% rename from modules/JiShe.CollectBus.IoTDB/Attribute/EntityTypeAttribute.cs rename to modules/JiShe.CollectBus.IoTDB/Attributes/EntityTypeAttribute.cs index 3610c00..89a4e38 100644 --- a/modules/JiShe.CollectBus.IoTDB/Attribute/EntityTypeAttribute.cs +++ b/modules/JiShe.CollectBus.IoTDB/Attributes/EntityTypeAttribute.cs @@ -1,6 +1,6 @@ using JiShe.CollectBus.IoTDB.Enums; -namespace JiShe.CollectBus.IoTDB.Attribute +namespace JiShe.CollectBus.IoTDB.Attributes { /// /// IoTDB实体类型特性 diff --git a/modules/JiShe.CollectBus.IoTDB/Attribute/FIELDColumnAttribute.cs b/modules/JiShe.CollectBus.IoTDB/Attributes/FIELDColumnAttribute.cs similarity index 82% rename from modules/JiShe.CollectBus.IoTDB/Attribute/FIELDColumnAttribute.cs rename to modules/JiShe.CollectBus.IoTDB/Attributes/FIELDColumnAttribute.cs index 7cabdf4..43d699f 100644 --- a/modules/JiShe.CollectBus.IoTDB/Attribute/FIELDColumnAttribute.cs +++ b/modules/JiShe.CollectBus.IoTDB/Attributes/FIELDColumnAttribute.cs @@ -1,4 +1,4 @@ -namespace JiShe.CollectBus.IoTDB.Attribute +namespace JiShe.CollectBus.IoTDB.Attributes { /// /// Column分类标记特性(FIELD字段),数据列字段 diff --git a/modules/JiShe.CollectBus.IoTDB/Attribute/SingleMeasuringAttribute.cs b/modules/JiShe.CollectBus.IoTDB/Attributes/SingleMeasuringAttribute.cs similarity index 91% rename from modules/JiShe.CollectBus.IoTDB/Attribute/SingleMeasuringAttribute.cs rename to modules/JiShe.CollectBus.IoTDB/Attributes/SingleMeasuringAttribute.cs index 5f0ca07..481bfa2 100644 --- a/modules/JiShe.CollectBus.IoTDB/Attribute/SingleMeasuringAttribute.cs +++ b/modules/JiShe.CollectBus.IoTDB/Attributes/SingleMeasuringAttribute.cs @@ -1,4 +1,4 @@ -namespace JiShe.CollectBus.IoTDB.Attribute +namespace JiShe.CollectBus.IoTDB.Attributes { /// /// 用于标识当前实体为单侧点模式,单侧点模式只有一个Filed标识字段,类型是Tuple,Item1=>测点名称,Item2=>测点值,泛型 diff --git a/modules/JiShe.CollectBus.IoTDB/Attribute/TAGColumnAttribute.cs b/modules/JiShe.CollectBus.IoTDB/Attributes/TAGColumnAttribute.cs similarity index 82% rename from modules/JiShe.CollectBus.IoTDB/Attribute/TAGColumnAttribute.cs rename to modules/JiShe.CollectBus.IoTDB/Attributes/TAGColumnAttribute.cs index 6f40a47..48a3830 100644 --- a/modules/JiShe.CollectBus.IoTDB/Attribute/TAGColumnAttribute.cs +++ b/modules/JiShe.CollectBus.IoTDB/Attributes/TAGColumnAttribute.cs @@ -1,4 +1,4 @@ -namespace JiShe.CollectBus.IoTDB.Attribute +namespace JiShe.CollectBus.IoTDB.Attributes { /// /// Column分类标记特性(TAG字段),标签字段 diff --git a/modules/JiShe.CollectBus.IoTDB/Attribute/TableNameOrTreePathAttribute.cs b/modules/JiShe.CollectBus.IoTDB/Attributes/TableNameOrTreePathAttribute.cs similarity index 92% rename from modules/JiShe.CollectBus.IoTDB/Attribute/TableNameOrTreePathAttribute.cs rename to modules/JiShe.CollectBus.IoTDB/Attributes/TableNameOrTreePathAttribute.cs index 1b4f4f0..ba0ca12 100644 --- a/modules/JiShe.CollectBus.IoTDB/Attribute/TableNameOrTreePathAttribute.cs +++ b/modules/JiShe.CollectBus.IoTDB/Attributes/TableNameOrTreePathAttribute.cs @@ -1,6 +1,6 @@ using JiShe.CollectBus.IoTDB.Enums; -namespace JiShe.CollectBus.IoTDB.Attribute +namespace JiShe.CollectBus.IoTDB.Attributes { /// /// IoTDB实体存储路径或表名称,一般用于已经明确的存储路径或表名称,例如日志存储 diff --git a/modules/JiShe.CollectBus.IoTDB/Model/IoTEntity.cs b/modules/JiShe.CollectBus.IoTDB/Model/IoTEntity.cs index 48bc248..40403ed 100644 --- a/modules/JiShe.CollectBus.IoTDB/Model/IoTEntity.cs +++ b/modules/JiShe.CollectBus.IoTDB/Model/IoTEntity.cs @@ -1,5 +1,5 @@ using JiShe.CollectBus.Common.Attributes; -using JiShe.CollectBus.IoTDB.Attribute; +using JiShe.CollectBus.IoTDB.Attributes; namespace JiShe.CollectBus.IoTDB.Model { diff --git a/modules/JiShe.CollectBus.IoTDB/Model/TableModelSingleMeasuringEntity.cs b/modules/JiShe.CollectBus.IoTDB/Model/TableModelSingleMeasuringEntity.cs index ed0fd4d..a5c98cf 100644 --- a/modules/JiShe.CollectBus.IoTDB/Model/TableModelSingleMeasuringEntity.cs +++ b/modules/JiShe.CollectBus.IoTDB/Model/TableModelSingleMeasuringEntity.cs @@ -1,5 +1,5 @@ using JiShe.CollectBus.Analyzers.Shared; -using JiShe.CollectBus.IoTDB.Attribute; +using JiShe.CollectBus.IoTDB.Attributes; using JiShe.CollectBus.IoTDB.Enums; namespace JiShe.CollectBus.IoTDB.Model diff --git a/modules/JiShe.CollectBus.IoTDB/Model/TreeModelSingleMeasuringEntity.cs b/modules/JiShe.CollectBus.IoTDB/Model/TreeModelSingleMeasuringEntity.cs index c87516c..6244cdf 100644 --- a/modules/JiShe.CollectBus.IoTDB/Model/TreeModelSingleMeasuringEntity.cs +++ b/modules/JiShe.CollectBus.IoTDB/Model/TreeModelSingleMeasuringEntity.cs @@ -1,5 +1,5 @@ using JiShe.CollectBus.Analyzers.Shared; -using JiShe.CollectBus.IoTDB.Attribute; +using JiShe.CollectBus.IoTDB.Attributes; using JiShe.CollectBus.IoTDB.Enums; namespace JiShe.CollectBus.IoTDB.Model diff --git a/modules/JiShe.CollectBus.IoTDB/Provider/IoTDBProvider.cs b/modules/JiShe.CollectBus.IoTDB/Provider/IoTDBProvider.cs index 0047122..c88403f 100644 --- a/modules/JiShe.CollectBus.IoTDB/Provider/IoTDBProvider.cs +++ b/modules/JiShe.CollectBus.IoTDB/Provider/IoTDBProvider.cs @@ -12,7 +12,7 @@ using JiShe.CollectBus.Common.Enums; using JiShe.CollectBus.Common.Extensions; using JiShe.CollectBus.Common.Helpers; using JiShe.CollectBus.Common.Models; -using JiShe.CollectBus.IoTDB.Attribute; +using JiShe.CollectBus.IoTDB.Attributes; using JiShe.CollectBus.IoTDB.Context; using JiShe.CollectBus.IoTDB.Interface; using JiShe.CollectBus.IoTDB.Model; @@ -213,7 +213,7 @@ namespace JiShe.CollectBus.IoTDB.Provider var query = await BuildQuerySQL(options); var sessionDataSet = await CurrentSession.ExecuteQueryStatementAsync(query); - + _logger.LogWarning($"{nameof(QueryAsync)} 主题的任务 {options.TableNameOrTreePath} 路径批次{options.PageIndex}任务数据读取完成,共消耗{stopwatch2.ElapsedMilliseconds}毫秒。"); var result = new BusPagedResult { @@ -319,71 +319,71 @@ namespace JiShe.CollectBus.IoTDB.Provider } } - //foreach (var measurement in tempColumnNames) - //{ + //foreach (var measurement in tempColumnNames) + //{ - // PropertyInfo propertyInfo = typeof(T).GetProperty(measurement); - // if (propertyInfo == null) - // { - // throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,没有找到{measurement}属性,属于异常情况,-101。"); - // } + // PropertyInfo propertyInfo = typeof(T).GetProperty(measurement); + // if (propertyInfo == null) + // { + // throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,没有找到{measurement}属性,属于异常情况,-101。"); + // } - // var value = propertyInfo.GetValue(entity); - // if (propertyInfo.IsDefined(typeof(SingleMeasuringAttribute), false) && metadata.IsSingleMeasuring == true)//表示当前对象是单测点模式 - // { - // if (value != null) - // { - // Type tupleType = value.GetType(); - // Type[] tupleArgs = tupleType.GetGenericArguments(); - // Type item2Type = tupleArgs[1]; // T 的实际类型 - // var item1 = tupleType.GetProperty("Item1")!.GetValue(value); - // var item2 = tupleType.GetProperty("Item2")!.GetValue(value); - // if (item1 == null || item2 == null) - // { - // throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,单测点模式构建失败,没有获取测点名称或者测点值,-102。"); - // } + // var value = propertyInfo.GetValue(entity); + // if (propertyInfo.IsDefined(typeof(SingleMeasuringAttribute), false) && metadata.IsSingleMeasuring == true)//表示当前对象是单测点模式 + // { + // if (value != null) + // { + // Type tupleType = value.GetType(); + // Type[] tupleArgs = tupleType.GetGenericArguments(); + // Type item2Type = tupleArgs[1]; // T 的实际类型 + // var item1 = tupleType.GetProperty("Item1")!.GetValue(value); + // var item2 = tupleType.GetProperty("Item2")!.GetValue(value); + // if (item1 == null || item2 == null) + // { + // throw new Exception($"{nameof(BuildTablet)} 构建表模型{typeof(T).Name}时,单测点模式构建失败,没有获取测点名称或者测点值,-102。"); + // } - // var indexOf = metadata.ColumnNames.IndexOf(measurement); - // metadata.ColumnNames[indexOf] = (string)item1!; + // var indexOf = metadata.ColumnNames.IndexOf(measurement); + // metadata.ColumnNames[indexOf] = (string)item1!; - // rowValues.Add(item2); - // } - // else - // { - // rowValues.Add(null); - // } + // rowValues.Add(item2); + // } + // else + // { + // rowValues.Add(null); + // } - // //同时如果是单测点模式,且是table模型存储,路径只能通过DevicePathBuilder.GetDeviceTableName(entity)获取 - // if (_runtimeContext.UseTableSessionPool) - // { - // tableNameOrTreePath = DevicePathBuilder.GetDeviceTableName(entity); - // } - // } - // else - // { + // //同时如果是单测点模式,且是table模型存储,路径只能通过DevicePathBuilder.GetDeviceTableName(entity)获取 + // if (_runtimeContext.UseTableSessionPool) + // { + // tableNameOrTreePath = DevicePathBuilder.GetDeviceTableName(entity); + // } + // } + // else + // { - // //需要根据value的类型,进行相应的值映射转换,例如datetime转换为long的时间戳值 - // if (value != null) - // { - // Type tupleType = value.GetType(); - // var tempValue = tupleType.Name.ToUpper() switch - // { - // "DATETIME" => Convert.ToDateTime(value).GetDateTimeOffset().ToUnixTimeNanoseconds(), - // _ => value - // }; + // //需要根据value的类型,进行相应的值映射转换,例如datetime转换为long的时间戳值 + // if (value != null) + // { + // Type tupleType = value.GetType(); + // var tempValue = tupleType.Name.ToUpper() switch + // { + // "DATETIME" => Convert.ToDateTime(value).GetDateTimeOffset().ToUnixTimeNanoseconds(), + // _ => value + // }; - // rowValues.Add(tempValue); - // } - // else - // { - // rowValues.Add(value); - // } + // rowValues.Add(tempValue); + // } + // else + // { + // rowValues.Add(value); + // } - // } + // } - //} + //} - values.Add(rowValues); + values.Add(rowValues); //如果指定了路径 if (!string.IsNullOrWhiteSpace(tableNameOrTreePath)) @@ -634,44 +634,57 @@ namespace JiShe.CollectBus.IoTDB.Provider private List CollectColumnMetadata(ISourceEntityAccessor accessor) { var columns = new List(); - - foreach (var prop in accessor.MemberList) - { - string typeName = string.Empty; - Type declaredType = prop.Type; + foreach (var member in accessor.MemberList) + { + //元组的子项字段详情不处理。 + if (member.NameOrPath.Contains(".Item")) + { + continue; + } + + string declaredTypeName = string.Empty; + + Type declaredType = member.DeclaredType;//属性的类型,如string,int等 + // 处理可空类型 if (declaredType.IsGenericType && declaredType.GetGenericTypeDefinition() == typeof(Nullable<>)) { Type underlyingType = Nullable.GetUnderlyingType(declaredType); - typeName = underlyingType.Name; + declaredTypeName = underlyingType.Name; } else { - typeName = declaredType.Name; + declaredTypeName = member.NameOrPath; } + + var tagAttr = member.CustomAttributes?.OfType().FirstOrDefault(); + var attrColumn = member.CustomAttributes?.OfType().FirstOrDefault(); + var fieldColumn = member.CustomAttributes?.OfType().FirstOrDefault(); + + //判断是否是单测数据 + var singleMeasuringAttribute = member.CustomAttributes?.OfType().FirstOrDefault(); + //先获取Tag标签和属性标签 - ColumnInfo? column = declaredType.GetCustomAttribute() is not null ? new ColumnInfo( - name: prop.Path, + ColumnInfo? column = tagAttr != null ? new ColumnInfo( + name: member.NameOrPath, category: ColumnCategory.TAG, - dataType: GetDataTypeFromTypeName(typeName), + dataType: GetDataTypeFromTypeName(declaredTypeName), false - ) : declaredType.GetCustomAttribute() is not null ? new ColumnInfo( - prop.Path, + ) : attrColumn != null ? new ColumnInfo( + member.NameOrPath, ColumnCategory.ATTRIBUTE, - GetDataTypeFromTypeName(typeName), + GetDataTypeFromTypeName(declaredTypeName), false - ) : declaredType.GetCustomAttribute() is not null ? new ColumnInfo( - prop.Path, + ) : fieldColumn != null ? new ColumnInfo( + member.NameOrPath, ColumnCategory.FIELD, - GetDataTypeFromTypeName(typeName), + GetDataTypeFromTypeName(declaredTypeName), false) : null; - //最先检查是不是单侧点模式 - SingleMeasuringAttribute singleMeasuringAttribute = declaredType.GetCustomAttribute(); - + //检查是不是单侧点模式 if (singleMeasuringAttribute != null && column == null) { //warning: 单侧点模式注意事项 @@ -679,15 +692,19 @@ namespace JiShe.CollectBus.IoTDB.Provider //只有一个Filed字段。 //MeasuringName 默认为 SingleMeasuringAttribute.FieldName,以便于在获取对应的Value的时候重置为 Item1 的值。 - //Type tupleType = prop.PropertyType; - //Type[] tupleArgs = tupleType.GetGenericArguments(); + Type tupleType = accessor.MemberList.Where(d => d.NameOrPath == $"{member.NameOrPath}.Item2").FirstOrDefault()?.DeclaredType; - //column = new ColumnInfo( - // singleMeasuringAttribute.FieldName, - // ColumnCategory.FIELD, - // GetDataTypeFromTypeName(tupleArgs[1].Name), - // true - //); + if (tupleType == null) + { + throw new Exception($"{nameof(CollectColumnMetadata)} {accessor.EntityName} {member.NameOrPath} 属性解析异常"); + } + + column = new ColumnInfo( + member.NameOrPath, + ColumnCategory.FIELD, + GetDataTypeFromTypeName(tupleType.Name), + true + ); } if (column.HasValue) diff --git a/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeter.cs b/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeter.cs index c04a554..ca1d0db 100644 --- a/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeter.cs +++ b/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeter.cs @@ -1,12 +1,12 @@ using JiShe.CollectBus.Analyzers.Shared; -using JiShe.CollectBus.IoTDB.Attribute; +using JiShe.CollectBus.IoTDB.Attributes; using JiShe.CollectBus.IoTDB.Enums; using JiShe.CollectBus.IoTDB.Model; namespace JiShe.CollectBus.Ammeters { [EntityType(EntityTypeEnum.TableModel)] - //[SourceAnalyzers] + [SourceAnalyzers] public class ElectricityMeter : IoTEntity { [ATTRIBUTEColumn] @@ -31,7 +31,7 @@ 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; } diff --git a/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeterTreeModel.cs b/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeterTreeModel.cs index 982c144..5fb6010 100644 --- a/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeterTreeModel.cs +++ b/services/JiShe.CollectBus.Domain/Ammeters/ElectricityMeterTreeModel.cs @@ -1,5 +1,5 @@ using JiShe.CollectBus.Analyzers.Shared; -using JiShe.CollectBus.IoTDB.Attribute; +using JiShe.CollectBus.IoTDB.Attributes; using JiShe.CollectBus.IoTDB.Enums; using JiShe.CollectBus.IoTDB.Model; using System; diff --git a/services/JiShe.CollectBus.Domain/IotSystems/MeterReadingRecords/MeterReadingTelemetryPacketInfo.cs b/services/JiShe.CollectBus.Domain/IotSystems/MeterReadingRecords/MeterReadingTelemetryPacketInfo.cs index 4b61e99..1d361be 100644 --- a/services/JiShe.CollectBus.Domain/IotSystems/MeterReadingRecords/MeterReadingTelemetryPacketInfo.cs +++ b/services/JiShe.CollectBus.Domain/IotSystems/MeterReadingRecords/MeterReadingTelemetryPacketInfo.cs @@ -1,5 +1,5 @@ using JiShe.CollectBus.Analyzers.Shared; -using JiShe.CollectBus.IoTDB.Attribute; +using JiShe.CollectBus.IoTDB.Attributes; using JiShe.CollectBus.IoTDB.Enums; using JiShe.CollectBus.IoTDB.Model; using System; diff --git a/shared/JiShe.CollectBus.Analyzers.Shared/EntityMemberInfo.cs b/shared/JiShe.CollectBus.Analyzers.Shared/EntityMemberInfo.cs index a45f4c2..28520be 100644 --- a/shared/JiShe.CollectBus.Analyzers.Shared/EntityMemberInfo.cs +++ b/shared/JiShe.CollectBus.Analyzers.Shared/EntityMemberInfo.cs @@ -9,24 +9,45 @@ namespace JiShe.CollectBus.Analyzers.Shared /// public sealed class EntityMemberInfo { - public string Path { get; set; } - public Type Type { get; set; } - private readonly Func _getter; - private readonly Action _setter; + /// + /// 名称或者路径 + /// + public string NameOrPath { get; set; } + + /// + /// 声明的类型 + /// + public Type DeclaredType { get; set; } + + /// + /// 获取值 + /// + public Func Getter { get; } + + /// + /// 设置值 + /// + public Action Setter { get; } + + /// + /// 自定义Attribute集合 + /// + public List CustomAttributes { get; set; } + public EntityMemberInfo( - string path, - Type type, + string nameOrPath, + Type declaredType, Func getter, Action setter) { - Path = path; - Type = type; - _getter = getter; - _setter = setter; + NameOrPath = nameOrPath; + this.DeclaredType = declaredType; + Getter = getter; + Setter = setter; } - public object GetValue(object entity) => _getter(entity); - public void SetValue(object entity, object value) => _setter(entity, value); + public object GetValue(object entity) => Getter(entity); + public void SetValue(object entity, object value) => Setter(entity, value); } } diff --git a/shared/JiShe.CollectBus.Analyzers.Shared/ISourceEntityAccessor.cs b/shared/JiShe.CollectBus.Analyzers.Shared/ISourceEntityAccessor.cs index 79df535..a6256ab 100644 --- a/shared/JiShe.CollectBus.Analyzers.Shared/ISourceEntityAccessor.cs +++ b/shared/JiShe.CollectBus.Analyzers.Shared/ISourceEntityAccessor.cs @@ -7,6 +7,11 @@ namespace JiShe.CollectBus.Analyzers.Shared { public interface ISourceEntityAccessor { + /// + /// 实体类名称 + /// + string EntityName { get; } + /// /// 获取属性值 ///