允许算术运算的通用razor组件



我想创建一个razor组件,允许输入整数或浮点数,并使用自旋控件增加或减少它们。然而,我不知道告诉Blazor生成器/c#编译器如何处理传递给组件的值的算术运算,因为类型是泛型的。我需要做些什么才能使这些操作成为可能?

下面是我的代码:

@typeparam TValue
@code {
[Parameter]
public TValue Value { get; set; }
[Parameter]
public EventCallback<TValue> ValueChanged { get; set; }
public void SpinUp() { Value += (TValue) 1; }
public void SpinDown() { Value -= (TValue) 1; }
}

我知道在编译时没有信息通用组件TValue是否支持数字运算。问题是如何告诉编译器TValue总是有一个数值数据类型(例如,一些限制)?

为了保持简短,我省略了所有的HTML,因为它说明了问题。SpinUp()和SpinDown()是由两个按钮组成的控件的回调函数,您可以单击它们来增加或减少数字文本框中的值。

似乎有点冗长,但是:

很高兴有任何缩短它的方法!

@typeparam TValue
<div>
<button class="btn btn-danger" @onclick=SpinDown>-</button>
<button class="btn btn-success" @onclick=SpinUp>+</button>
</div>
<div>
Value = @Value?.ToString()
</div>
@code {
[Parameter]
public TValue? Value { get; set; }
[Parameter]
public EventCallback<TValue> ValueChanged { get; set; }
private void SpinUp()
{
TValue value;
switch (Value)
{
case int val:
val++;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case long val:
val++;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case short val:
val++;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case decimal val:
val++;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case float val:
val++;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case double val:
val++;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
default:
throw new Exception("Can't do maths operations on the type suplied");
};
ValueChanged.InvokeAsync(value);
}
private void SpinDown()
{
TValue value;
switch (Value)
{
case int val:
val--;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case long val:
val--;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case short val:
val--;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case decimal val:
val--;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case float val:
val--;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
case double val:
val--;
value = (TValue)Convert.ChangeType(val, typeof(TValue));
break;
default:
throw new Exception("Can't do maths operations on the type suplied");
};
ValueChanged.InvokeAsync(value);
}
}

测试页面:

@page "/"
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
<Spinner @bind-Value=value/>
<div>
Value : @value.ToString()
</div>
@code {
private double value = 0;
}

如果你愿意使用。net 7预览位,你可以这样做

public partial class NumericThing<TValue>  where TValue : INumber<TValue>
{
[Parameter]
public TValue Value { get; set; }

[Parameter]
public EventCallback<TValue> ValueChanged { get; set; }
public void SpinUp()
{           
Value += TValue.CreateChecked(1);
}
public void SpinDown()
{
Value -= TValue.CreateChecked(1);
}
}

最新更新