Как временно заменить один тип примитива другим при компиляции в различные цели?

Ниже ссылка на хороший пример о том, как custimize WixUIExtensions.

Специализированный UIs для Wix

5
задан Brian Tompsett - 汤莱恩 27 November 2015 в 11:41
поделиться

5 ответов

Лучший способ сделать это - использовать #if, как сказал Эндрю выше. Тем не менее, интересная идея для размышлений была бы примерно такой:

#if USE_FLOAT
using Numeric = System.Single;
#endif

#if USE_DOUBLE
using Numeric = System.Double;
#endif

#if USE_DECIMAL
using Numeric = System.Decimal;
#endif

public class SomeClass
{
    public Numeric MyValue{get;set;}
}

РЕДАКТИРОВАТЬ:

Мне все еще нравится это решение, оно позволяет вам делать некоторые другие действительно интересные вещи, такие как:

Numeric.Parse();
Numeric.TryParse();

Что будет работать для всех три типа

8
ответ дан 14 December 2019 в 04:44
поделиться

В худшем случае, я думаю, вы могли бы использовать бокс и что-то вроде этого:

#if USE_FLOAT
public float OutputValue(object input)
{
    return (float)input;
}
#endif

#if USE_DOUBLE
public double OutputValue(object input)
{
    return (double)input;
}
#endif

и вызвать OutputValue (1.5); , чтобы он преобразовал его для вас.

0
ответ дан 14 December 2019 в 04:44
поделиться

Один из подходов состоит в том, чтобы иметь общий тип вокруг необходимого вам базового типа. Затем вы объявляете класс, который наследует конкретный экземпляр этого универсального шаблона, в отдельном файле .cs, и вы создаете три копии этого класса для каждого необходимого вам базового типа. Затем вы изменяете свой .csproj, чтобы включить соответствующий файл .cs на основе конфигурации сборки.

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

0
ответ дан 14 December 2019 в 04:44
поделиться

Вы можете сделать это:

public struct NumberContainer<T> 
{
    T _number;

    // accessor, and possibly: operators, cast methods, etc.
}

А затем:

#if USE_FLOAT
public struct MyNumber : NumberContainer<float>
#else
public struct MyNumber : NumberContainer<double>
#endif
{
}
0
ответ дан 14 December 2019 в 04:44
поделиться

Это сложно, поскольку базовые типы не требуют чего-то вроде IArithmetic. Это много раз предлагалось на сайте Connect . К сожалению, это хорошо известное ограничение обобщенных типов .

Есть некоторые обходные пути с использованием класса структуры «калькулятор» . Если математика не слишком обременительна, это работает очень, очень хорошо

Однако это неуклюже. Это то место, где универсальные шаблоны не так гибки, как шаблоны C ++.

Еще один подход может заключаться в использовании чего-то вроде Text Template Transformation Toolkit (T4) для создания шаблона, который будет работать с любым типом , и компилировать отдельные для каждого типа.

0
ответ дан 14 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: