@using Microsoft.FluentUI.AspNetCore.Components.Extensions @typeparam TEnum where TEnum : struct, Enum @code { [Parameter] public TEnum? EnumSelectedValue { get; set; } [Parameter] public EventCallback EnumSelectedValueChanged { get; set; } [Parameter] public TEnum[] ExcludeEnumItems { get; set; } = []; [Parameter] public string? Placeholder { get; set; } [Parameter] public string? Label { get; set; } [Parameter(CaptureUnmatchedValues = true)] public Dictionary AdditionalAttributes { get; set; } = new(); private List> _enumOptions = []; private string? _selectedValue { get { return _enumOptions.FirstOrDefault(e => e.Value.Equals(GetEnumInt(EnumSelectedValue)))?.Value.ToString(); } set { if (value is null || !Enum.TryParse(value, out var result)) return; EnumSelectedValue = result; EnumSelectedValueChanged.InvokeAsync(result); } } protected override void OnInitialized() { if (!typeof(TEnum).IsEnum) { throw new InvalidOperationException($"{typeof(TEnum).Name} is not an enum type"); } } protected override void OnParametersSet() { _enumOptions = Enum.GetValues(typeof(TEnum)) .Cast() .Where(e => !ExcludeEnumItems.Contains(e)) .Select(e => new Option { Value = GetEnumInt(e).GetValueOrDefault(), Text = e.GetDescription(false), Selected = e.Equals(EnumSelectedValue) }) .ToList(); } private static int? GetEnumInt(TEnum? value) { if (!typeof(TEnum).IsEnum || value is null) return null; return (int)Convert.ChangeType(value, typeof(TEnum)); } }