在泛型类中,如果 T 不可为空,如何创建 Nullable<T> 属性?

问题描述 投票:0回答:1

我有以下类,通常可以接受数字或

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 组件适用吗?

c# .net generics blazor nullable
1个回答
0
投票

此答案演示了它如何与 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

© www.soinside.com 2019 - 2024. All rights reserved.