#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">