Я создал оболочку над элементом управления 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? поэтому мне нужно использовать определенный способ преобразования. Я бы хотел избежать выражений switch или if.
Что бы ты сделал?
Чтобы прояснить мой вопрос, я предоставил больше кода ...
Я спросил связанный вопрос на прошлой неделе. Думаю, в вашем случае ответ может быть эффективным.
Я не понял, чем это может помочь. Хотелось бы как-нибудь использовать логику преобразователя.
Вы бы вернули что-то вроде MathProvider <T>
Думаю, вопрос в том, как создать это «что-то похожее».





Непонятно, как вы собираетесь его использовать. Если вам нужен метод double create 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
Зачем нужны дженерики, если все, что вам нужно, это double и int?
Аку, это круто, но, к сожалению, DoubleConveter не поддерживает десятичные числа: |
Я не понимаю, о чем вы говорите. Почему именно DoubleConverter? Этот код работает с десятичным числом? @decimal = ConvertFromString <десятичный> ("99999999999999999999999");
и это тоже: ConvertFromString <decimal> ("1.1")
Поскольку этот метод всегда будет возвращать результат
numericUpDown.Value
у вас нет причин для преобразования значения во что-либо, кроме Decimal. Вы пытаетесь решить проблему, которой у вас нет?
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;
}
Ваш вопрос не совсем ясен. Является ли метод GetValue частью оболочки? Или numericUpDown является экземпляром оболочки? Может быть, поможет еще немного кода, показывающего, чего вы пытаетесь достичь.