gpt4 book ai didi

c# - 无需显式转换即可处理数字的通用方法

转载 作者:行者123 更新时间:2023-11-30 22:29:48 26 4
gpt4 key购买 nike

我有一个类,它有一个通用类型的属性,如下所示。类型 T 可以是任何数字(short、int、float ...)

    public class EqualFilter <T> : Filter {
private T _value;
public override T Value {
get {
return _value;
}
set {
if (!EqualityComparer<T>.Default.Equals(_value, value)) {
_value = value;
RaiseFilteringChanged();
}
}
}
.....
}

现在我有一个客户端类,它有一个需要传递给上面的 setter 的“字符串”。现在在上面的 setter 中设置值时,类型 T 已经在运行时确定,我可以在我的客户端中获取该类型作为类型 T。是否可以在客户端程序中将字符串转换为由 EqualFilter 标识的适当类型?像这样的东西不起作用

Type T = filter.getFilterType();
filter.Value = (T) myTextBox.Text;

下面的代码有效,但它会涉及所有可以为数字的类型的 if-else。

Type T = filter.getFilterType();
if (T == typeof(int)) {
filter.Value = Int32.Parse(myTextBox.Text);
} else if() {
....
}

简而言之,我不确定如何以更好的方式解决这个问题。

最佳答案

听起来您正在做类似于数据绑定(bind)的事情。如果您只对使用字符串感兴趣,您可以考虑将泛型类型限制为 IConvertible 并从特殊的 setter 方法调用 Convert.ChangeType 方法,如下所示:

public class EqualFilter<T> : Filter where T : IConvertible {

// ... omitted Value property code ...

public void SetValue(string value)
{
Value = (T)Convert.ChangeType(value, typeof(T));
}

// ...
}

通用类型约束只允许那些类型 Convert.ChangeType可以操作。除了整数和浮点类型之外,这还允许使用类型 stringdecimalDateTime。请注意,在使用 double 类型时,string 类型可能并不总是准确的,因为可能存在舍入和浮点表示错误。此外,您可能还需要捕获其他异常以使其更加健壮(例如,FormatExceptionOverflowException)。

void Main()
{
var a = new EqualFilter<int> { Value = 10 };
var b = new EqualFilter<double> { Value = 20 };
b.Value = Math.PI; // RaiseFilteringChanged called - no surprise
b.SetValue(Math.PI.ToString()); // RaiseFilteringChanged called - surprised?
Console.WriteLine(b.Value);
b.SetValue("25");
Console.WriteLine(b.Value);
var c = new EqualFilter<DateTime> { Value = DateTime.Today };
Console.WriteLine(c.Value);
c.SetValue("12/23/2011");
Console.WriteLine(c.Value);

// compiler error object isn't an IConvertible:
// var illegal = new EqualFilter<object>();
}

在这种情况下,大 switch 语句由 ChangeType 方法中的框架处理。

编辑:从我上面的代码版本中添加 Console.WriteLine 输出(具有覆盖和基类用法注释掉):

3.14159265358979

25

4/10/2012 12:00:00 AM

12/23/2011 12:00:00 AM

关于c# - 无需显式转换即可处理数字的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com