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;
+ }
}