具有事件回调的 Blazor 通用组件
Blazor generic component with eventcallback
我创建了一个父组件可以绑定到的组件。这是一个缩小的例子:
<input @bind=@Value />
@code {
[Parameter]
public EventCallback<string> ValueChanged { get; set; }
[Parameter]
public string Value
{
get => _Value;
set
{
if (_Value == value) return;
_Value = value;
ValueChanged.InvokeAsync(value);
}
}
}
正在运行,父组件可以绑定到值并获取更新。
我现在想让组件通用。这意味着,我希望父组件也能够绑定一个 int 值。
我尝试使用 typeparam,但后来这一行
if (_Value == value) return;
不再工作了。
如何使这个组件通用?
你不能直接使用==
比较泛型类型,你需要有一个比较方法。
殿下@JonSkeet here 使用 EqualityComparer<T>.Default.Equals(x, y);
解释了正确的方法
所以你的对比代码(假设泛型是TItem
)是:
[Parameter] public EventCallback<TItem> ValueChanged { get; set; }
[Parameter] public TItem Value
{
get => _Value;
set
{
if (EqualityComparer<T>.Default.Equals(_Value, value)) return;
_Value = value;
ValueChanged.InvokeAsync(value);
}
}
我创建了一个父组件可以绑定到的组件。这是一个缩小的例子:
<input @bind=@Value />
@code {
[Parameter]
public EventCallback<string> ValueChanged { get; set; }
[Parameter]
public string Value
{
get => _Value;
set
{
if (_Value == value) return;
_Value = value;
ValueChanged.InvokeAsync(value);
}
}
}
正在运行,父组件可以绑定到值并获取更新。
我现在想让组件通用。这意味着,我希望父组件也能够绑定一个 int 值。 我尝试使用 typeparam,但后来这一行
if (_Value == value) return;
不再工作了。
如何使这个组件通用?
你不能直接使用==
比较泛型类型,你需要有一个比较方法。
殿下@JonSkeet here 使用 EqualityComparer<T>.Default.Equals(x, y);
所以你的对比代码(假设泛型是TItem
)是:
[Parameter] public EventCallback<TItem> ValueChanged { get; set; }
[Parameter] public TItem Value
{
get => _Value;
set
{
if (EqualityComparer<T>.Default.Equals(_Value, value)) return;
_Value = value;
ValueChanged.InvokeAsync(value);
}
}