Могу ли я получить операторы приведения через отражение и вызвать их (или, если есть лучшее название для этого действия)? Это главный вопрос, если да, то это решает мою проблему.

Но если кто-то знает другое решение для следующего:

У меня много объектных переменных (неизвестные количества до времени выполнения), каждый из них имеет другой тип, но все они числа (double, int, short).

С другой стороны, у меня такое же количество двойных варов, и мне нужно сравнивать значения каждого из них.

object[] Value1; //this can be double, short or int, only known at runtime.
double[] Value2;

//I need simply to do:
(for int i = 0; i < Value1.Length, i++)
{
    (if Value1[i] == Value2[i]) //here's the problem
    //the comparison always return false, because of different types
    ....

Я пробовал много вещей, в том числе метод «CompareTo», вызываемый через отражение, но он требует, чтобы переменные объекта были того же типа, что и экземпляр, содержащий вызываемый метод. (Невозможно вызвать из числа double и передать параметр int, а также вызвать из числа int и передать параметр типа double)

Итак, если бы я мог просто привести их: один способ - от двойного к неизвестному типу (для этого мне пришлось бы использовать некоторое отражение) Другой способ - это двухэтапное приведение от объекта к неизвестному типу, а от этого к двойному .

Ограничения:

  • динамический не вариант (старый фреймворк)

  • Элементы Value1 поступают индивидуально «как объект» из внешнего неизменяемого метода.

1
Daniel Möller 19 Мар 2013 в 17:09

1 ответ

Лучший ответ

Измените Value1 на double[]. Если у вас есть object для вставки в него (экземпляр short, int, double и т. Д.), Используйте Convert.ToDouble(value), или если у вас есть известный short или int, он будет неявно преобразовываться в double. Затем их можно сравнить с double в Value2.

1
Tim S. 19 Мар 2013 в 17:40
Забыл сказать: элементы Value1 происходят из метода другой сборки (неизменяемой). Он возвращает значение as object (типа int, short или double). Вот почему я не могу просто поместить их в Value1. Это было бы то же самое, что попытаться привести объект к удвоению.
 – 
Daniel Möller
19 Мар 2013 в 17:19
1
@Daniel, если значения для Value1 (а не самого Value1) взяты из существующего метода, вы можете использовать Convert.ToDouble(value) для двойных, коротких и целых чисел и заставить их быть двойными. Тогда Value1 может просто иметь тип double[], как предлагает Тим.
 – 
Ruben
19 Мар 2013 в 17:26