Передать перечисление в параметр компонента Blazor

#generics #enums #blazor #blazor-server-side

#generics #перечисления #blazor #blazor-на стороне сервера

Вопрос:

У меня есть компонент Razor, которому в качестве параметра требуется перечисление. Я читал, что вы должны использовать @typeparam для передачи универсального типа, но когда я пытаюсь использовать его с именем переменной EnumType , я получаю ошибку следующего вида каждый раз, когда я набираю EnumType

EnumType Не удалось найти имя типа или пространства имен (вам не хватает директивы using или ссылки на сборку?

Код выглядит примерно так:

 @typeparam TEnum


@foreach (EnumType flag in Enum.GetValues(typeof(EnumType)))
    {
        if (((EnumType)Old).HasFlag(flag))
        {
            if (((EnumType)New).HasFlag(flag))
            {
                <li>@EnumExtensions.GetEnumDisplayName(flag)</li>
            }
            else
            {
                <li class="deleted-li">@EnumExtensions.GetEnumDisplayName(flag)</li>
            }

        }
    }

@code{
    [Parameter]
    public TEnum EnumType { get; set; }
    //          ^ only time I dont get the error

    [Parameter]
    public int Old { get; set; }

    [Parameter]
    public int New { get; set; }
}
  

Редактировать: я сделал перерыв и вернулся, чтобы посмотреть на свой код, и понял, что это не имеет смысла. С тех пор я обновил его, чтобы он напоминал:

 @typeparam TEnum

@foreach (Enum flag in Enum.GetValues(typeof(TEnum)))
    {
        if (((Enum)Convert.ChangeType(Old, typeof(TEnum))).HasFlag(flag))
        {
            if (((Enum)Convert.ChangeType(New, typeof(TEnum))).HasFlag(flag))
            {
                <li>@EnumExtensions.GetEnumDisplayName(flag)</li>
            }
            else
            {
                <li class="deleted-li">
                    @EnumExtensions.GetEnumDisplayName(flag) 
                 </li>
            }

        }
    }
@code{
    [Parameter]
    public int Old { get; set; }
    [Parameter]
    public int New { get; set; }
}
  

Теперь я получаю ((Enum)Convert.ChangeType(Old, typeof(TEnum)) сообщение об ошибке:

Недопустимое приведение из ‘System.Int32’ в ‘DataAccessLibrary.Перечисления.TimelineinfoEnums misorductenum’.

Комментарии:

1. Попробуйте выполнить код с помощью public partial class YourComponent<TEnum> : ComponentBase where TEnum : Enum

2. ((TEnum)Enum.ToObject(typeof(TEnum), Old))

3. Спасибо, Брайан, Enum.ToObject работает. Я должен привести его к Enum вместо TEnum , потому TEnum что не содержит определения для .HasFlag()

4. При подходе, лежащем в основе кода, это было бы так, как если бы у него было ограничение перечисления.

Ответ №1:

Вам нужно установить значение для объекта EnumType в жизненном OnInitialized(){ ... } цикле или OnInitializedAsync(){ ... } .

Справочный документ: https://learn.microsoft.com/en-us/aspnet/core/blazor/components/lifecycle?view=aspnetcore-3.1

Комментарии:

1. Да, мне нужно было бы это сделать, если бы я собирался правильно использовать эту переменную, но поскольку мне нужен был только тип, а не переменная, мне никогда не нужно EnumType было начинать. Я обновил вопрос, чтобы лучше отразить то, что я должен был сделать, и проблему, с которой я сейчас сталкиваюсь.

Ответ №2:

У меня только что возникла эта проблема. В вашем коде объявите переменную нужного вам типа (enum), а затем

 <TargerComponent ParameterThatNeesdEnum="@YourTypedVariable">