using COA.EnterpriseServices.DataAccess.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; namespace COA.EnterpriseServices.DataAccess.QuickBase { internal static class FieldMapRegistry { private static readonly ICollection registry = new List(); static FieldMapRegistry() { // Map to QB field IDs. Obviously we will use actual IDs AddFieldMap(c => c.Id, 1); AddFieldMap(c => c.Created, 2); AddFieldMap(c => c.Modified, 3); AddFieldMap(c => c.Status, 10); AddFieldMap(c => c.ClientFirstName, 20); AddFieldMap(c => c.ClientLastName, 21); AddFieldMap(c => c.CurrentCreditorProfileId, 90); AddFieldMap(c => c.OriginalCreditorProfileId, 91); AddFieldMap(c => c.Id, 1); AddFieldMap(c => c.Created, 2); AddFieldMap(c => c.Modified, 3); AddFieldMap(c => c.Email, 10); AddFieldMap(c => c.Phone, 11); AddFieldMap(c => c.FirstName, 20); AddFieldMap(c => c.LastName, 21); } internal static void AddFieldMap(Expression> property, int fieldId) { if (property.Body is MemberExpression memberExpression) { registry.Add(new FieldMap { DeclaringTypeName = memberExpression.Member.DeclaringType.FullName, PropertyName = memberExpression.Member.Name, FieldId = fieldId }); } else if (property.Body is UnaryExpression unaryExpression && unaryExpression.Operand is MemberExpression unaryMemberExpression) { registry.Add(new FieldMap { DeclaringTypeName = unaryMemberExpression.Member.DeclaringType.FullName, PropertyName = unaryMemberExpression.Member.Name, FieldId = fieldId }); } } internal static int? GetFieldId(PropertyInfo info) { var map = registry.FirstOrDefault(m => m.DeclaringTypeName == info.DeclaringType.FullName && m.PropertyName == info.Name); return map != null ? map.FieldId : default; } } }