Skip to content

Commit 0d27e1b

Browse files
committed
Added enum description attribute to lookup table #6
1 parent 1ad473c commit 0d27e1b

File tree

4 files changed

+30
-0
lines changed

4 files changed

+30
-0
lines changed

samples/SpatialFocus.EntityFrameworkCore.Extensions.SQLiteDemo/Entities/SpecialOccasion.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,23 @@
55

66
namespace SpatialFocus.EntityFrameworkCore.Extensions.SQLiteDemo.Entities
77
{
8+
using System.ComponentModel;
9+
810
public enum SpecialOccasion
911
{
12+
[Description("Your birth anniversary")]
1013
Birthday = 1,
1114

15+
[Description("Jesus' birth anniversary")]
1216
Christmas,
1317

18+
[Description("Jesus' resurrection anniversary")]
1419
Easter,
1520

21+
[Description("Florist holiday")]
1622
Valentines,
1723

24+
[Description("Marriage anniversary")]
1825
Wedding,
1926
}
2027
}

src/SpatialFocus.EntityFrameworkCore.Extensions/EnumLookupExtension.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ namespace SpatialFocus.EntityFrameworkCore.Extensions
77
{
88
using System;
99
using System.Collections.Generic;
10+
using System.ComponentModel;
1011
using System.Linq;
12+
using System.Reflection;
1113
using Microsoft.EntityFrameworkCore;
1214
using Microsoft.EntityFrameworkCore.Metadata;
1315
using Microsoft.EntityFrameworkCore.Metadata.Builders;
@@ -71,6 +73,10 @@ public static void ConfigureEnumLookup(this ModelBuilder modelBuilder, EnumLooku
7173

7274
ConcreteTypeSeededList.Add(concreteType);
7375

76+
Dictionary<int, string> enumValueDescriptions = Enum.GetValues(propertyType.GetEnumOrNullableEnumType())
77+
.Cast<Enum>()
78+
.ToDictionary(Convert.ToInt32, GetEnumDescription);
79+
7480
// TODO: Check status of https://github.com/aspnet/EntityFrameworkCore/issues/12194 before using migrations
7581
object[] data = Enum.GetValues(propertyType.GetEnumOrNullableEnumType())
7682
.OfType<object>()
@@ -82,10 +88,14 @@ public static void ConfigureEnumLookup(this ModelBuilder modelBuilder, EnumLooku
8288
{
8389
concreteType.GetProperty(nameof(EnumWithNumberLookup<object>.Id)).SetValue(instance, x);
8490
concreteType.GetProperty(nameof(EnumWithNumberLookup<object>.Name)).SetValue(instance, x.ToString());
91+
concreteType.GetProperty(nameof(EnumWithNumberLookup<object>.Description))
92+
.SetValue(instance, enumValueDescriptions[(int)x]);
8593
}
8694
else
8795
{
8896
concreteType.GetProperty(nameof(EnumWithStringLookup<object>.Id)).SetValue(instance, x);
97+
concreteType.GetProperty(nameof(EnumWithNumberLookup<object>.Description))
98+
.SetValue(instance, enumValueDescriptions[(int)x]);
8999
}
90100

91101
return instance;
@@ -96,6 +106,15 @@ public static void ConfigureEnumLookup(this ModelBuilder modelBuilder, EnumLooku
96106
}
97107
}
98108

109+
public static string GetEnumDescription(Enum value)
110+
{
111+
FieldInfo fi = value.GetType().GetField(value.ToString());
112+
113+
DescriptionAttribute attribute = (DescriptionAttribute)fi.GetCustomAttribute(typeof(DescriptionAttribute), true);
114+
115+
return attribute?.Description;
116+
}
117+
99118
private static Type GetEnumOrNullableEnumType(this Type propertyType)
100119
{
101120
if (!propertyType.IsEnumOrNullableEnumType())

src/SpatialFocus.EntityFrameworkCore.Extensions/EnumWithNumberLookup.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public EnumWithNumberLookup(T value)
1919
Name = value.ToString();
2020
}
2121

22+
public string Description { get; set; }
23+
2224
[DatabaseGenerated(DatabaseGeneratedOption.None)]
2325
public T Id { get; set; }
2426

src/SpatialFocus.EntityFrameworkCore.Extensions/EnumWithStringLookup.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public EnumWithStringLookup(T value)
1818
Id = value;
1919
}
2020

21+
public string Description { get; set; }
22+
2123
[DatabaseGenerated(DatabaseGeneratedOption.None)]
2224
public T Id { get; set; }
2325
}

0 commit comments

Comments
 (0)