Files
SabreTools.Serialization/SabreTools.Metadata/Tools/AttributeHelper.cs
2026-03-24 18:03:01 -04:00

48 lines
1.7 KiB
C#

using System;
namespace SabreTools.Metadata.Tools
{
public static class AttributeHelper<T>
{
/// <summary>
/// Get the MappingAttribute from a supported value
/// </summary>
/// <param name="value">Value to use</param>
/// <returns>MappingAttribute attached to the value</returns>
public static MappingAttribute? GetAttribute(T? value)
{
// Null value in, null value out
if (value is null)
return null;
// Current enumeration type
var enumType = typeof(T);
if (Nullable.GetUnderlyingType(enumType) is not null)
enumType = Nullable.GetUnderlyingType(enumType);
// If the value returns a null on ToString, just return null
string? valueStr = value.ToString();
if (string.IsNullOrEmpty(valueStr))
return null;
// Get the member info array
var memberInfos = enumType?.GetMember(valueStr);
if (memberInfos is null)
return null;
// Get the enum value info from the array, if possible
var enumValueMemberInfo = Array.Find(memberInfos, m => m.DeclaringType == enumType);
if (enumValueMemberInfo is null)
return null;
// Try to get the relevant attribute
var attributes = enumValueMemberInfo.GetCustomAttributes(typeof(MappingAttribute), true);
if (attributes is null || attributes.Length == 0)
return null;
// Return the first attribute, if possible
return (MappingAttribute?)attributes[0];
}
}
}