ПОЧЕМУ параметры компонента Blazor должны быть автоматическими свойствами?C#

Место общения программистов C#
Ответить
Anonymous
 ПОЧЕМУ параметры компонента Blazor должны быть автоматическими свойствами?

Сообщение Anonymous »

Из официальной документации Microsoft:

Параметры компонента следует объявлять как автосвойства, что означает
что они не должны содержать пользовательскую логику в методах доступа get или set
. Например, следующее свойство StartData является
автосвойством:
csharp [Parameter] public DateTime StartData { get; set; }

https://learn.microsoft.com/en-us/aspne ... etcore-9.0

Ну, это догма, потому что я не вижу оправдания.
Я согласен, что не должно быть сложного логика, но есть важный случай, когда простая логика должно быть - это проверка.
Пример
Значение параметра theme компонента AdmonitionBlock должно быть либо элемент перечисления StandardThemes или элемент перечисления CustomThemes, который должен быть определен с помощью метода defineThemes перед использованием компонента AdmonitionBlock:
public partial class AdmonitionBlock : Microsoft.AspNetCore.Components.ComponentBase

{

public static string CSS_NAMESPACE = "AdmonitionBlock";

public enum StandardThemes { regular }

protected internal static Type? CustomThemes;

public static void defineThemes(Type CustomThemes)
{
YDF_ComponentsHelper.ValidateCustomTheme(CustomThemes);
AdmonitionBlock.CustomThemes = CustomThemes;
}

protected string _theme = AdmonitionBlock.StandardThemes.regular.ToString();

[Microsoft.AspNetCore.Components.Parameter]
public object theme
{
get => this._theme;
set => YDF_ComponentsHelper.
AssignThemeIfItIsValid(value, AdmonitionBlock.CustomThemes, ref this._theme);
}

protected internal static bool mustConsiderThemesCSS_ClassesAsCommon = YDF_ComponentsHelper.areThemesCSS_ClassesCommon;

public static void considerThemesAsCommon()
{
AdmonitionBlock.mustConsiderThemesCSS_ClassesAsCommon = true;
}

[Microsoft.AspNetCore.Components.Parameter]
public bool areThemesCSS_ClassesCommon { get; set; } =
YDF_ComponentsHelper.areThemesCSS_ClassesCommon || AdmonitionBlock.mustConsiderThemesCSS_ClassesAsCommon;

}

Проверка выполняется классом ComponentsHelper (не только для компонента AdmonitionBlock ):
public abstract class ComponentsHelper
{

public static bool areThemesCSS_ClassesCommon = false;

public static void ValidateCustomTheme(Type CustomThemes)
{
if (!CustomThemes.IsEnum)
{
throw new CustomYDF_ThemeIsNotEnumerationException();
}
}

public static void AssignThemeIfItIsValid(object value, Type? customThemes, ref string _theme)
{

if (value is TStandardThemes standardTheme)
{
_theme = $"{ standardTheme }";
return;
}

string stringifiedThemeValue = value.ToString() ?? "";

if (customThemes is not null)
{

Type customThemesType = customThemes;

if (customThemesType.IsEnum && Enum.GetNames(customThemesType).Contains(stringifiedThemeValue))
{
_theme = stringifiedThemeValue;
return;
}

}

throw new InvalidThemeParameterForYDF_ComponentException();

}

}


Подробнее здесь: https://stackoverflow.com/questions/793 ... properties
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»