Как преобразовать типы во время выполнения?

Мой сценарий должен быть простым... тип, который я хочу преобразовать FROM, - это строка "ВСЕГДА". То, что я хочу преобразовать в... может быть много вещей - ints, DateTimes,... строки и т.д.

Это было бы легко:

string valueToConvertFrom = "123";

int blah = Convert.ToInt32(valueToConvertFrom);

Однако... Я не знаю (до выполнения), что значение, которое мне нужно преобразовать, - это "Int" (или что-то еще). Я пробовал это:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

object blah = Convert.ChangeType(valueToConvertFrom, convertToType);

Но это дает мне следующую ошибку: "Объект должен реализовывать IConvertible".

Я не хочу делать оператор switch и вызывать "Convert.ToBlah" на основе имени типа... любые предложения?

Ответ 1

чистый способ сделать это - использовать TypeConverter. вы можете получить экземпляр преобразователя типов, вызвав TypeDescriptor.GetConverter, а затем используя экземпляр конвертера типов для преобразования. так что-то вроде этого:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);

Ответ 2

Класс String реализует IConvertible, этот код просто ДОЛЖЕН работать. Какую версию .NET вы нацеливаете?

object o = Convert.ChangeType( str, convertToType );

Кроме того, большинство типов, которые вы упомянули, используют метод Parse, поэтому ваш лучший снимок может быть примерно таким.

Type convertToType = ...;
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static);
object blah;
if(mi != null)
{
    blah = mi.Invoke(null, new object[]{valueToConvertFrom});
}
else
{
    // the type doesn't implement the Parse method, handle it another way :/
}

Ответ 3

Вопрос Тимоти, как правило, применительно к вопросу о преобразовании типов в .NET, является очень большой проблемой. Хотя в конкретных сценариях с известными типами стратегии конверсии несколько очевидны, к сожалению, в любой реализации .NET не существует обобщенной стратегии для выполнения преобразования типа во время выполнения от одного произвольного типа к другому, и такая стратегия не ожидается из Редмонда. Тем не менее, Microsoft поставляет некоторые хорошие рекомендации для общей концепции преобразования типов, в том числе:

Мне приходилось иметь дело с одной и той же общей проблемой в моих системах, и в качестве решения я объединил все стандартные стратегии в один метод. Объем этой проблемы является широким, и соответствующие стратегии конверсии разнообразны, поэтому этот консолидированный подход может быть рассмотрен только в полной технической статье. Тем не менее, я предлагаю здесь копию моей документации по методам в надежде, что это поможет вам получить четкое представление об общих требованиях, которые вам необходимо решить, если вы хотите разработать аналогичное обобщенное решение. Здесь ссылка на мою документацию:

Я надеюсь, что это поможет вам,

Марк