Как преобразовать типы во время выполнения?
Мой сценарий должен быть простым... тип, который я хочу преобразовать 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 поставляет некоторые хорошие рекомендации для общей концепции преобразования типов, в том числе:
Мне приходилось иметь дело с одной и той же общей проблемой в моих системах, и в качестве решения я объединил все стандартные стратегии в один метод. Объем этой проблемы является широким, и соответствующие стратегии конверсии разнообразны, поэтому этот консолидированный подход может быть рассмотрен только в полной технической статье. Тем не менее, я предлагаю здесь копию моей документации по методам в надежде, что это поможет вам получить четкое представление об общих требованиях, которые вам необходимо решить, если вы хотите разработать аналогичное обобщенное решение. Здесь ссылка на мою документацию:
Я надеюсь, что это поможет вам,
Марк