Преобразование типов во время выполнения с использованием отражения? - PullRequest
2 голосов
/ 06 декабря 2011

Пожалуйста, взгляните на следующий код:

        var val1 = ExtractValue(firstParam);
        var val2 = ExtractValue(secondParam);

        var type1 = val1.GetType();
        var type2 = val2.GetType();

        TypeConverter converter1 = TypeDescriptor.GetConverter(type1);
        TypeConverter converter2 = TypeDescriptor.GetConverter(type2);

        if (converter1 != null && converter1.CanConvertFrom(type2))
        {
            var temp = converter1.ConvertFrom(val2);
            return val1.Equals(temp);
        }
        return false;

для меня загадка, что этот код не возвращает true, когда я пробую его с "int" и объектом Enum.Я даже пробовал «val1.Equals ((int) (val2))» в «Немедленном окне», и результат был верным, но все же converter1.CanConvertFrom (type2) ложен.

Не могли бы вы помочь мне об этом?Есть что-то, чего мне не хватает?

Спасибо

Ответы [ 2 ]

6 голосов
/ 06 декабря 2011

Обобщенное преобразование типов в .NET довольно слабое и непоследовательное (на мой взгляд). Однако для случая Enum / int вы можете использовать интерфейс IConvertible или Convert связанный служебный класс:

int converted = (int)Convert.ChangeType(MyEnum.MyValue, typeof(int));

или

object converted = Convert.ChangeType(myValue, myExpectedType);

Как примечание сайта, эта 100% бесплатная библиотека здесь: CodeFluentRuntimeClient имеет класс с именем ConvertUtilities, который имеет множество перегрузок метода ChangeType (включая универсальный), которые очень универсальны и полезны для преобразование типов.

3 голосов
/ 06 декабря 2011

Обратите внимание на замечания в документации :

Как реализовано в этом классе, этот метод всегда возвращает false. Никогда не возвращается true.

Единственный раз, когда вы получите другой ответ, это если у вас есть производная от TypeConverter. Но важно отметить, что многие производные TypeConverter в Framework (скажем, BaseNumberConverter НЕ переопределяют CanConvertFrom.

...