我在NumbericUpDown控件上构建了一个包装器。 包装器是通用的,可以支持int吗?加倍?
我想写一个方法来执行以下操作。
public partial class NullableNumericUpDown<T> : UserControl where T : struct
{
private NumbericUpDown numericUpDown;
private T? Getvalue()
{
T? value = numericUpDown.Value as T?; // <-- this is null :) thus my question
return value;
}}
当然小数和双数之间没有强制转换?还是int?所以我需要使用某种转换方式。 我想避免切换或if表达式。
你会做什么?
为了澄清我的问题,我提供了更多代码......
答案 0 :(得分:5)
目前尚不清楚你将如何使用它。 如果你想双重创建GetDouble()方法,对于整数 - GetInteger()
编辑:
好的,现在我想我理解你的用例
试试这个:
using System;
using System.ComponentModel;
static Nullable<T> ConvertFromString<T>(string value) where T:struct
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
if (converter != null && !string.IsNullOrEmpty(value))
{
try
{
return (T)converter.ConvertFrom(value);
}
catch (Exception e) // Unfortunately Converter throws general Exception
{
return null;
}
}
return null;
}
...
double? @double = ConvertFromString<double>("1.23");
Console.WriteLine(@double); // prints 1.23
int? @int = ConvertFromString<int>("100");
Console.WriteLine(@int); // prints 100
long? @long = ConvertFromString<int>("1.1");
Console.WriteLine(@long.HasValue); // prints False
答案 1 :(得分:0)
由于此方法将始终返回
的结果numericUpDown.Value
您没有理由将值转换为除Decimal以外的任何值。你想解决一个你没有的问题吗?
答案 2 :(得分:0)
public class FromDecimal<T> where T : struct, IConvertible
{
public T GetFromDecimal(decimal Source)
{
T myValue = default(T);
myValue = (T) Convert.ChangeType(Source, myValue.GetTypeCode());
return myValue;
}
}
public class FromDecimalTestClass
{
public void TestMethod()
{
decimal a = 1.1m;
var Inter = new FromDecimal<int>();
int x = Inter.GetFromDecimal(a);
int? y = Inter.GetFromDecimal(a);
Console.WriteLine("{0} {1}", x, y);
var Doubler = new FromDecimal<double>();
double dx = Doubler.GetFromDecimal(a);
double? dy = Doubler.GetFromDecimal(a);
Console.WriteLine("{0} {1}", dx, dy);
}
}
private T? Getvalue()
{
T? value = null;
if (this.HasValue)
value = new FromDecimal<T>().GetFromDecimal(NumericUpDown);
return value;
}