Как преобразовать десятичное число в Т?

Я создал оболочку над элементом управления 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.

Что бы ты сделал?

Чтобы прояснить мой вопрос, я предоставил больше кода ...

Ваш вопрос не совсем ясен. Является ли метод GetValue частью оболочки? Или numericUpDown является экземпляром оболочки? Может быть, поможет еще немного кода, показывающего, чего вы пытаетесь достичь.

Paul Batum 21.09.2008 15:10

Я спросил связанный вопрос на прошлой неделе. Думаю, в вашем случае ответ может быть эффективным.

Sklivvz 21.09.2008 15:01

Я не понял, чем это может помочь. Хотелось бы как-нибудь использовать логику преобразователя.

ArielBH 21.09.2008 15:06

Вы бы вернули что-то вроде MathProvider <T>

Sklivvz 21.09.2008 15:17

Думаю, вопрос в том, как создать это «что-то похожее».

aku 22.09.2008 05:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
5
2 742
3

Ответы 3

Непонятно, как вы собираетесь его использовать. Если вам нужен метод 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?

aku 21.09.2008 15:08

Аку, это круто, но, к сожалению, DoubleConveter не поддерживает десятичные числа: |

ArielBH 21.09.2008 15:48

Я не понимаю, о чем вы говорите. Почему именно DoubleConverter? Этот код работает с десятичным числом? @decimal = ConvertFromString <десятичный> ("99999999999999999999999");

aku 21.09.2008 16:08

и это тоже: ConvertFromString <decimal> ("1.1")

aku 21.09.2008 16:13

Поскольку этот метод всегда будет возвращать результат

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;
}

Другие вопросы по теме