gpt4 book ai didi

C# 泛型 : how to use x. 泛型类中的 MaxValue/x.MinValue (int, float, double)

转载 作者:太空狗 更新时间:2023-10-29 19:53:17 25 4
gpt4 key购买 nike

我正在使用 WPF 扩展工具包 ( http://wpftoolkit.codeplex.com/)。

它有一个很好的 NumericUpDown 控件,我想使用它,但它在内部使用 double - 这意味着它使用 double.MinValue 和 double.MaxValue。

我想使用相同的控件,但我需要一个通用版本——对于整数,它需要使用 int.MaxValue/MinValue,对于 float ,它需要使用 float.MaxValue/MinValue,等等(我想你明白了: ))

所以我考虑将 NumericUpDown 复制到 GNumericUpDown,其中 T 当然是 Type..但这不起作用,因为泛型类型没有 MinValue/MaxValue。通常我会使用“where”子句来指定基类型,但这不起作用,因为 afaik 没有定义“MinValue”和“MaxValue”的通用接口(interface)。

有没有办法用泛型解决这个问题,或者我真的需要为每种类型复制/粘贴/搜索并替换原始的 NumericUpDown 吗?

最佳答案

好吧,鉴于您可以在执行时获取类型,您可以依赖于 .NET 中的所有数字类型都具有 MinValueMaxValue 字段,并通过反射读取它们。它不会非常好,但很容易做到:

using System;
using System.Reflection;

// Use constraints which at least make it *slightly* hard to use
// with the wrong types...
public class NumericUpDown<T> where T : struct,
IComparable<T>, IEquatable<T>, IConvertible
{
public static readonly T MaxValue = ReadStaticField("MaxValue");
public static readonly T MinValue = ReadStaticField("MinValue");

private static T ReadStaticField(string name)
{
FieldInfo field = typeof(T).GetField(name,
BindingFlags.Public | BindingFlags.Static);
if (field == null)
{
// There's no TypeArgumentException, unfortunately. You might want
// to create one :)
throw new InvalidOperationException
("Invalid type argument for NumericUpDown<T>: " +
typeof(T).Name);
}
return (T) field.GetValue(null);
}
}

class Test
{
static void Main()
{
Console.WriteLine(NumericUpDown<int>.MaxValue);
Console.WriteLine(NumericUpDown<float>.MinValue);
}
}

请注意,如果您将其与不合适的类型一起使用,我会尽我所能强制执行编译时错误……但这并非万无一失。如果您设法找到一个具有所有正确接口(interface)但没有 MinValueMaxValue 字段的结构,那么任何使用该类型的 NumericUpDown 的尝试将导致抛出异常。

关于C# 泛型 : how to use x. 泛型类中的 MaxValue/x.MinValue (int, float, double),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4418636/

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