In a similar vein to my post on storing complex properties of a TableEntity in Azure Table Storage it’s also possible to store Enum text values by using custom attributes to control serialization/deserialization.

ReceiptRequestEntity.cs
public class ReceiptRequestEntity : TableEntity { public ReceiptRequestEntity(string emailAddress, string functionInvocationId) { this.PartitionKey = emailAddress; this.RowKey = functionInvocationId; } public bool? OptIn { get; set; } public string Type { get; set; } [EntityEnumPropertyConverter] public ActionType? ActionType { get; set; } public int? SequenceId { get; set; } [EntityJsonPropertyConverter] public Dictionary<int, string> Products { get; set; } public string RedirectUri { get; set; } [EntityJsonPropertyConverter] public bool IsValid { get { bool _isValid = true; if (string.IsNullOrEmpty(PartitionKey) || string.IsNullOrEmpty(Type) || string.IsNullOrEmpty(ActionType) || OptIn == null || SequenceId == null || Products.Count == 0) { _isValid = false; } return _isValid; } } public override IDictionary<string, EntityProperty> WriteEntity(OperationContext operationContext) { var results = base.WriteEntity(operationContext); EntityJsonPropertyConverter.Serialize(this, results); EntityEnumPropertyConverter.Serialize(this, results); return results; } public override void ReadEntity(IDictionary<string, EntityProperty> properties, OperationContext operationContext) { base.ReadEntity(properties, operationContext); EntityJsonPropertyConverter.Deserialize(this, properties); EntityEnumPropertyConverter.Deserialize(this, properties); } }
EntityEnumPropertyConverterAttribute.cs
[AttributeUsage(AttributeTargets.Property)] public class EntityEnumPropertyConverterAttribute : Attribute { public EntityEnumPropertyConverterAttribute() { } } public class EntityEnumPropertyConverter { public static void Serialize<TEntity>(TEntity entity, IDictionary<string, EntityProperty> results) { entity.GetType().GetProperties() .Where(x => x.GetCustomAttributes(typeof(EntityEnumPropertyConverterAttribute), false).Count() > 0) .ToList() .ForEach(x => results.Add(x.Name, new EntityProperty(x.GetValue(entity) != null ? x.GetValue(entity).ToString() : null))); } public static void Deserialize<TEntity>(TEntity entity, IDictionary<string, EntityProperty> properties) { entity.GetType().GetProperties() .Where(x => x.GetCustomAttributes(typeof(EntityEnumPropertyConverterAttribute), false).Count() > 0) .ToList() .ForEach(x => x.SetValue(entity, Enum.Parse(x.PropertyType, properties[x.Name].StringValue))); } }

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *