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

StackOverflow https://stackoverflow.com/questions/312858

Вопрос

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

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

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

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

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

Отметка

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top