Как я могу конвертировать типы во время выполнения?
-
10-07-2019 - |
Вопрос
Мой сценарий должен быть простым...тип, который я хочу преобразовать От является ВСЕГДА "строка".То, во что я хочу преобразовать...это может быть много чего - целые числа, даты и время...струны и т.д.
Это было бы легко:
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" на основе имени типа...есть какие-нибудь предложения?
Решение
чистый способ сделать это - использовать TypeConverter. Вы можете получить экземпляр преобразователя типов, вызвав TypeDescriptor .GetConverter , а затем использовать экземпляр преобразователя типов для выполнения преобразования. ну как то так:
string valueToConvertFrom = "123";
Type convertToType = typeof(int);
TypeConverter tc = TypeDescriptor.GetConverter(convertToType);
object blah =tc.ConvertFromString(valueToConvertFrom);
Другие советы
Класс 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 :/
}
Вопрос Тимоти, применяемый в целом к вопросу преобразования типов в .NET, является очень большой проблемой.Хотя стратегии преобразования в определенной степени просты в конкретных сценариях с известными типами, к сожалению, ни в одной реализации .NET нет обобщенной стратегии для выполнения преобразования типов во время выполнения из одного произвольного типа в другой, и от Redmond такой стратегии не ожидается.Однако Корпорация Майкрософт предоставляет несколько хороших рекомендаций по общей концепции преобразования типов, в том числе:
- Преобразование типов в .NET Framework
- Приведение и преобразования типов (Руководство по программированию на C #)
- Преобразователи типов и XAML
Мне приходилось сталкиваться с такой же общей проблемой в моих системах, и в качестве решения я объединил все стандартные стратегии в один метод.Сфера охвата этого вопроса широка, а соответствующие стратегии преобразования разнообразны, поэтому этот консолидированный подход может быть рассмотрен только в полной технической статье.Однако я предлагаю здесь копию документации по моему методу в надежде, что это поможет вам получить четкое представление об общих требованиях, которые вам нужно будет выполнить, если вы хотите разработать аналогичное обобщенное решение.Вот ссылка на мою документацию:
Я надеюсь, что это поможет вам,
Отметка