Кастинг переменной с помощью Переменной типа

Вы не указали свою попытку запроса, но, вероятно, это примерно так:

SELECT
  ID, Q1, Q2, Q3, Q4,
  Q1 + Q2 + Q3 + Q4 AS "Total"
FROM MyTable

Если значения из Q1, Q2, Q3 или Q4 null, Q1 + Q2 + Q3 + Q4 будет null. Для обработки нулей как нуля и получения правильной суммы сделайте это вместо этого:

SELECT
  ID, Q1, Q2, Q3, Q4,
  COALESCE(Q1,0) + COALESCE(Q2,0) + COALESCE(Q3,0) + COALESCE(Q4,0) AS "Total"
FROM MyTable

Функция COALESCE вернет первое ненулевое значение в списке.

254
задан theringostarrs 9 June 2009 в 10:39
поделиться

4 ответа

Конечно, вы можете вот как простое (предположим, что это преобразование типа T), так и, если это удобно, преобразование (предположим, мы можем преобразовать это в T):

public T CastExamp1<T>(object input) {   
    return (T) input;   
}

public T ConvertExamp1<T>(object input) {
    return (T) Convert.ChangeType(input, typeof(T));
}

Изменить:

Некоторые люди в комментариях говорят, что этот ответ не отвечает на вопрос. Но строка (T) Convert.ChangeType (input, typeof (T)) предоставляет решение. Метод Convert.ChangeType пытается преобразовать любой объект в тип, указанный в качестве второго аргумента.

Например:

Type intType = typeof(Int32);
object value1 = 1000.1;

// Variable value2 is now an int with a value of 1000
object value2a = Convert.ChangeType(value1, intType);
int value2b = Convert.ChangeType(value1, intType);

// Variable value3 is now an int with a value of 1000
dynamic value3 = Convert.ChangeType(value1, intType);

Я написал ответ с помощью универсальных шаблонов, потому что я думаю, что это очень вероятный признак запаха кода, когда вы хотите преобразовать что-то в что-то еще без обработки фактического типа. С правильными интерфейсами в этом нет необходимости в 99,9% случаев.

183
ответ дан 23 November 2019 в 02:49
поделиться

Вред, проблема - Вы, не имеют T.

у Вас только есть Переменная типа.

Подсказка к MS, если бы Вы могли бы сделать что-то как

TryCast<typeof(MyClass)>

, если решил бы все наши проблемы.

0
ответ дан 23 November 2019 в 02:49
поделиться

Если отложить упаковку и распаковку в сторону для простоты, нет никаких конкретных действий во время выполнения, задействованных в приведении типов по иерархии наследования. В основном это время компиляции. По сути, приведение говорит компилятору рассматривать значение переменной как другой тип.

Что вы могли бы сделать после преобразования? Вы не знаете тип, поэтому не сможете вызывать для него какие-либо методы. Вы не могли бы сделать ничего особенного. В частности, он может быть полезен, только если вы знаете возможные типы во время компиляции, приводите их вручную и обрабатываете каждый случай отдельно с помощью операторов if :

if (type == typeof(int)) {
    int x = (int)obj;
    DoSomethingWithInt(x);
} else if (type == typeof(string)) {
    string s = (string)obj;
    DoSomethingWithString(s);
} // ...
8
ответ дан 23 November 2019 в 02:49
поделиться

Как ты мог это сделать? Вам нужна переменная или поле типа T, где вы можете сохранить объект после приведения, но как у вас может быть такая переменная или поле, если вы знаете T только во время выполнения? Так что нет, это невозможно.

Type type = GetSomeType();
Object @object = GetSomeObject();

??? xyz = @object.CastTo(type); // How would you declare the variable?

xyz.??? // What methods, properties, or fields are valid here?
6
ответ дан 23 November 2019 в 02:49
поделиться
Другие вопросы по тегам:

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