- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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 中的所有数字类型都具有 MinValue
和 MaxValue
字段,并通过反射读取它们。它不会非常好,但很容易做到:
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)但没有 MinValue
和 MaxValue
字段的结构,那么任何使用该类型的 NumericUpDown
的尝试将导致抛出异常。
关于C# 泛型 : how to use x. 泛型类中的 MaxValue/x.MinValue (int, float, double),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4418636/
我想知道,为什么 SqlDateTime.MinValue 与 DateTime.MinValue 不一样? 最佳答案 我认为 SQL 和 .NET 的 Date 数据类型之间的差异源于 SQL Se
在 C# 中我看到了 -1 * int.MinValue == int.MinValue 这是一个错误吗?当我试图实现搜索树时,它真的把我搞砸了。我最终使用了 (int.MinValue + 1) 这
我第一次尝试这个(在 vb.net 中) (Double.MinValue + Double.Epsilon) > Double.MinValue 但这评估为假。然后我尝试了这个 (Double.Mi
考虑下面的 C# 代码: public class Program { public static void Main(string[] args) { //Your
是否可以为 minValue 规则编写依赖回调,例如使用所需的文本? 我有 2 个必填字段 -> 已付价格和已见价格(对于回扣表格)。我尝试写这样的东西: minValue: functio
我正在使用返回 1.1.0001 的 Datetime.Minvalue。此值无法存储到 DB,因为年份小于 1975。 是否可以将 DateTime.Minvalue 覆盖为 1.1.1901? 问
我正在尝试将 Int64.MinValue (-0x8000000000000000) 写为负十六进制数,但 Visual Studio 2010 不允许我这样做,因为它假定 0x8000000000
最近在分析 session 期间,一种方法引起了我的注意,在分析器的反编译版本中它看起来像这样: public static double dec2f(Decimal value) { if
我刚刚发现我的 SqlDateTime.MinValue 在不同的机器上是不同的。 有时是 = DateTime(1953, 1, 1, 0, 0, 0); 但在其他机器上它是 = DateTime(
我正在学习 Java 并正在阅读一本 Java 编程书。我已经到了他们教我有关数组的程度。 因此,我创建了一个采用非特定数量的命令行参数的数组,并将其与书籍代码结合起来以打印出该数组中的最大值。它工作
我正在编写一个使用 Quartz.Net 的 F# 服务轮询另一个服务(已用 C# 编写): [] [] type PollingJob() = interface IJob with
所以我目前正在尝试测试一个使用随机函数的函数。为了测试它,我将一个种子值传递给 C# Random 函数。 (即系统。随机) 我的测试用例涉及使用 int.MaxValue 和 int.MinValu
我们试图在我们的应用程序中覆盖 DateTime.MinValue,但是这样做我们注意到我们的 Web 服务超时,下面是示例代码。不确定哪里出了问题/我们缺少什么。 public MainWindo
如演示中所示,maxValue 设置为 2017 年,但图表一直到 2020 年。 如何让图表真正停在 2017 年?它在我的页面上占用了太多空间,因此我想对其进行优化 See demo fiddle
我在使用 TimeSpans 时找到了关于 TimeSpan.MinValue 的信息在 MSDN 中。我想知道为什么他们将其直接包含在类里面,或者更好:是否有一个经典示例说明您为什么/何时要使用它。
当我写这段代码的时候 Console.WriteLine(-1 * int.MinValue); 或 int a = -1 * -2147483648; 我得到一个错误 The operation o
我找不到如何检查大于 0 的值,因为 minValue(0) 也接受 0,但是如果使用 minValue(1) 那么任何介于 0 之间的小数并且 1 也不会被接受。 我也不知道为什么我不能使用来自 d
我正在尝试绘制具有对数刻度的 Google 条形图。但是,它从 1 开始,而不是 0。这看起来像是错误数据,因为具有一个值的条目在呈现时没有条形。我尝试将 minValue 设置为零,但当 logSc
我认为这看起来像是 C# 编译器中的错误。 考虑这段代码(在一个方法中): const long dividend = long.MinValue; const long divisor = -1L;
我似乎无法将 sqldatatime.minvalue 转换为 datetime 对象。 我试过: Datetime dt = Convert.ToDateTime(SqlDateTime.MinVa
我是一名优秀的程序员,十分优秀!