Назначение типа во время выполнения - PullRequest
4 голосов
/ 10 февраля 2011

У меня есть переменная x типа T и значение в строке. Например, у меня есть:

bool x, value = "True"
int x, value = "1"
  • Есть ли общий способ присвоения / разбора / десериализации значения для x?

Обратите внимание, что T может быть ссылочным или примитивным типом!

Ответы [ 3 ]

5 голосов
/ 10 февраля 2011

вы можете использовать Convert.ChangeType метод .

Это будет охватывать все базовые типы преобразования.

Пример: var i = Convert.ChangeType("1", typeof(int));

Вы можететакже взгляните на IConvertible интерфейс , который вы можете использовать для преобразования ваших собственных объектов из или в другой тип.

Наконец, как сказал codymanix, вы можете положиться на OOB XmlSerializationили двоичная сериализация для сериализации ваших объектов.

[править] вы можете проверить во время компиляции, является ли целевой тип конвертируемым, обернув метод convert.ChangeType в служебный класс, подобный этому:

public static class ConvertUtility
{
    public static T Convert<T>(object source) where T : IConvertible
    {
        return (T)System.Convert.ChangeType(source, typeof(T));
    }              
}
1 голос
/ 10 февраля 2011

Я написал этот подход, основанный на отражении, некоторое время назад. Это относительно непроверено все же. Он ищет методы с именами Parse и TryParse. И я не позаботился о локальном (не) зависимом разборе.

    private static class ParseDelegateStore<T>
    {
        public static ParseDelegate<T> Parse;
        public static TryParseDelegate<T> TryParse;
    }

    private delegate T ParseDelegate<T>(string s);
    private delegate bool TryParseDelegate<T>(string s, out T result);


    public static T Parse<T>(string s)
    {
        ParseDelegate<T> parse = ParseDelegateStore<T>.Parse;
        if (parse == null)
        {
            parse = (ParseDelegate<T>)Delegate.CreateDelegate(typeof(ParseDelegate<T>), typeof(T), "Parse", true);
            ParseDelegateStore<T>.Parse = parse;
        }
        return parse(s);
    }

    public static bool TryParse<T>(string s, out T result)
    {
        TryParseDelegate<T> tryParse = ParseDelegateStore<T>.TryParse;
        if (tryParse == null)
        {
            tryParse = (TryParseDelegate<T>)Delegate.CreateDelegate(typeof(TryParseDelegate<T>), typeof(T), "TryParse", true);
            ParseDelegateStore<T>.TryParse = tryParse;
        }
        return tryParse(s, out result);
    }
0 голосов
/ 10 февраля 2011

Я знаю другой способ, кроме как:

object x;
if (theType==typeof(int))
   x = int.parse(myString);
else if (theType==typeof(bool))
  x = bool.Parse(myString);
// and so on for other types..

Также обратите внимание, что сериализованные данные должны содержать имена типов, потому что в противном случае у вас нет возможности узнать, имеет ли тип "123" тип int или unsigned short иличто угодно, или если, например, «Red» является значением перечисления, объектом Color или строкой.

Вы можете использовать XmlSerializer или BinaryFormatter для сериализации / десериализации ваших объектов, что делает всю эту логикууже для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...