Я хочу преобразовать var на основе Тип другой переменной.
Причиной этого является то, что у меня есть метод расширения, который будет применять вычисление на T, обеспечивающее, что T - это double, float или decimal (я проверяю правильный тип в начале метода).
Так или иначе, тестирование конверсии с помощью следующего фрагмента кода вызывает ошибку:
List<double> source = new List<double>();
source.Add(1);
Type typ = source.First().GetType();
var newVal = Convert.ChangeType(source.First(), typeof(typ)); //error: typ not found
Тип или имя пространства имен "typ" не удалось найти (вы не указали директиву использования или ссылку на сборку?)
Однако это прекрасно работает:
List<double> source = new List<double>();
source.Add(1);
Type typ = source.First().GetType();
var newVal = Convert.ChangeType(source.First(), typeof(double));
обратите внимание, что объект Type
и ссылка на тип - это не одно и то же.
В то время как Type typ
создает объект типа Type
, typeof(T)
возвращает объект Type
на основе T
, который известен во время компиляции (для генериков это время JIT-компиляции, но оно работает одинаково).
Таким образом, вы не можете использовать объект Type
для общего параметра напрямую, потому что он является объектом, а не ссылкой на тип.
Обратите внимание, однако, что поскольку typeof
возвращает объект Type
, этот случай можно решить, используя typ
напрямую.
List<double> source = new List<double>();
source.Add(1);
Type typ = source.First().GetType();
var newVal = Convert.ChangeType(source.First(), typ);
typeof
не принимает переменную в качестве параметра.