using System.Reflection; using InfluxDB.Client.Core.Flux.Internal; namespace InfluxDB.Client.Linq { /// /// Resolver to use customized tag and field names in LINQ queries. /// public interface IMemberNameResolver { /// /// Get Type Of Member /// /// for actual member /// Type of member for actual member MemberType ResolveMemberType(MemberInfo memberInfo); /// /// Get name of property that will be use as a tag name or field name in InfluxDB. /// /// property /// Returns name of field or tag in InfluxDB string GetColumnName(MemberInfo memberInfo); /// /// Get name of property for named field. /// /// property /// value of expression /// Return name of property. string GetNamedFieldName(MemberInfo memberInfo, object value); } public enum MemberType { Measurement, Tag, Field, Timestamp, // Member Value is used as a name of field NamedField, // Member Value is used as a value of NamedField NamedFieldValue } public class DefaultMemberNameResolver : IMemberNameResolver { private readonly AttributesCache _attributesCache = new AttributesCache(); public MemberType ResolveMemberType(MemberInfo memberInfo) { var attribute = _attributesCache.GetAttribute(memberInfo as PropertyInfo); if (attribute != null) { if (attribute.IsMeasurement) { return MemberType.Measurement; } if (attribute.IsTag) { return MemberType.Tag; } if (attribute.IsTimestamp) { return MemberType.Timestamp; } } return MemberType.Field; } public string GetColumnName(MemberInfo memberInfo) { var propertyInfo = memberInfo as PropertyInfo; var attribute = _attributesCache.GetAttribute(propertyInfo); return _attributesCache.GetColumnName(attribute, propertyInfo); } public string GetNamedFieldName(MemberInfo memberInfo, object value) { return GetColumnName(memberInfo); } } }