enum selector support natvie aot

This commit is contained in:
Dameng
2024-08-03 19:51:26 +08:00
parent c09e8b5b2a
commit 0ecbfdcd5a

View File

@@ -130,6 +130,35 @@ public class EnumSelector: TemplatedControl
Values = GenerateItemTuple(); Values = GenerateItemTuple();
} }
// netstandard 2.0 does not support Enum.GetValuesAsUnderlyingType, which is used for native aot compilation
#if NET8_0_OR_GREATER
private List<EnumItemTuple> GenerateItemTuple()
{
if (EnumType is null) return new List<EnumItemTuple>();
var values = Enum.GetValuesAsUnderlyingType(EnumType);
List<EnumItemTuple> list = new();
foreach (var value in values)
{
// value is underlying type like int/byte/short
var enumValue = Enum.ToObject(EnumType, value);
var displayName = Enum.GetName(EnumType, value);
if(displayName is null) continue;
var field = EnumType.GetField(displayName);
var description = field?.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault();
if (description is not null)
{
displayName = ((DescriptionAttribute) description).Description;
}
list.Add(new EnumItemTuple()
{
DisplayName = displayName,
Value = enumValue
});
}
return list;
}
#else
private List<EnumItemTuple> GenerateItemTuple() private List<EnumItemTuple> GenerateItemTuple()
{ {
if (EnumType is null) return new List<EnumItemTuple>(); if (EnumType is null) return new List<EnumItemTuple>();
@@ -157,4 +186,5 @@ public class EnumSelector: TemplatedControl
return list; return list;
} }
#endif
} }