我有以下类,通常可以接受数字或
string
类型:
public class MdSlider<TValue> where TValue: IConvertible, IEquatable<TValue>
{
TValue? Value { get; set; }
TValue? Min { get; set; }
TValue? Max { get; set; }
// ...
}
但是我刚刚意识到,例如,如果用户创建一个
MdSlider<double>
,所有这三个属性都是double
而不是double?
,并且默认情况下它们的值为0
而不是null
。当用户未设置时,我的应用程序需要空值。
如果我添加
struct
约束,string
不再被接受。
我无法为
MdSlider
声明单独的 string
,因为这是在 Blazor 中,并且组件名称必须是唯一的(MdSlider<TValue>
和 MdSlider
被认为是相同的),并且我不想创建不同的 MdSliderString
例如。
是否可以声明泛型类型参数,并在属性不可为 null 时强制使用
Nullable
?还有其他解决方案可以使 Blazor 组件适用吗?
此答案演示了它如何与 Blazor 组件配合使用:
这是我的演示
Slider.razor
@typeparam TValue
<input type="range" @bind:get="Value" @bind:set="SetValue" class="form-range" min="@Min" max="@Max" id="customRange2">
@code {
[Parameter] public TValue? Value { get; set; }
[Parameter] public EventCallback<TValue?> ValueChanged { get; set; }
[Parameter] public TValue? Max { get; set; }
[Parameter] public TValue? Min { get; set; }
private async Task SetValue(TValue? value)
{
await this.ValueChanged.InvokeAsync(value);
}
}
演示
Index
同时使用可为空字符串和[不可为空]双精度。
@page "/"
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
<div class="mb-3">
<Slider Max="_stringMax" Min="_stringMin" @bind-Value="_stringValue" />
</div>
<div class="mb-3">
<Slider Max="_max" Min="_min" @bind-Value="_value" />
</div>
<div class="bg-dark text-white m-2 p-2">
<pre>String Value : @_stringValue</pre>
<pre>Value : @_value</pre>
</div>
@code {
string? _stringMax = "10";
string? _stringMin = "-10";
string? _stringValue;
double _max = 10;
double _min = -10;
double _value;
}
之所以有效,是因为子级中的
Value
与组件定义中提供的值之间没有紧密耦合。父组件中提供的值在 ParameterView
中定义,并传递给 ParametersSetAsync
中的子组件。如何将其应用于子组件取决于子组件:正常方式使用反射并优雅地处理类型转换。
您可以手动执行此操作 - 请参阅https://learn.microsoft.com/en-us/aspnet/core/blazor/performance?view=aspnetcore-7.0#implement-setparametersasync-manually。