Вы не указали свою попытку запроса, но, вероятно, это примерно так:
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
вернет первое ненулевое значение в списке.
Конечно, вы можете вот как простое (предположим, что это преобразование типа 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% случаев.
Вред, проблема - Вы, не имеют T.
у Вас только есть Переменная типа.
Подсказка к MS, если бы Вы могли бы сделать что-то как
TryCast<typeof(MyClass)>
, если решил бы все наши проблемы.
Если отложить упаковку и распаковку в сторону для простоты, нет никаких конкретных действий во время выполнения, задействованных в приведении типов по иерархии наследования. В основном это время компиляции. По сути, приведение говорит компилятору рассматривать значение переменной как другой тип.
Что вы могли бы сделать после преобразования? Вы не знаете тип, поэтому не сможете вызывать для него какие-либо методы. Вы не могли бы сделать ничего особенного. В частности, он может быть полезен, только если вы знаете возможные типы во время компиляции, приводите их вручную и обрабатываете каждый случай отдельно с помощью операторов if
:
if (type == typeof(int)) {
int x = (int)obj;
DoSomethingWithInt(x);
} else if (type == typeof(string)) {
string s = (string)obj;
DoSomethingWithString(s);
} // ...
Как ты мог это сделать? Вам нужна переменная или поле типа 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?