Как я могу конвертировать типы во время выполнения? - PullRequest
21 голосов
/ 23 ноября 2008

Мой сценарий должен быть простым ... тип, который я хочу преобразовать ОТ - это ВСЕГДА 'строка'. То, что я хочу преобразовать в ... может быть много вещей - целые числа, 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 на основе имени типа ... какие-либо предложения?

Ответы [ 3 ]

30 голосов
/ 23 ноября 2008

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

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);
5 голосов
/ 30 октября 2011

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

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

Надеюсь, это поможет вам,

Mark

5 голосов
/ 23 ноября 2008

Класс 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 :/
}
...