diff --git a/StabilityMatrix.Core/Models/StringValue.cs b/StabilityMatrix.Core/Models/StringValue.cs index 98e7ab48..e8d71898 100644 --- a/StabilityMatrix.Core/Models/StringValue.cs +++ b/StabilityMatrix.Core/Models/StringValue.cs @@ -1,4 +1,8 @@ -namespace StabilityMatrix.Core.Models; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using System.Runtime.Serialization; + +namespace StabilityMatrix.Core.Models; public abstract record StringValue(string Value) : IFormattable { @@ -13,4 +17,30 @@ public abstract record StringValue(string Value) : IFormattable { return Value; } + + /// + /// Get all values of type as a dictionary. + /// Includes all public static properties. + /// + protected static Dictionary GetValues< + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T + >() + where T : StringValue + { + var values = new Dictionary(); + + foreach (var field in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Static)) + { + if (field.GetValue(null) is T value) + { + // Exclude if IgnoreDataMember + if (field.GetCustomAttribute() is not null) + continue; + + values.Add(value.Value, value); + } + } + + return values; + } }