Лучший способ создать C # Type из строки для сериализации / десериализации - PullRequest
1 голос
/ 31 января 2012

Я хочу преобразовать строку в тип C #.Вариант использования: я храню сериализованные данные в кеше вместе с типом, а затем возвращаю их обратно.У меня есть собственный класс с именем DataEntities.Show (где DataEntities это пространство имен).Если я сохраню тип этого класса «DataEntities.ShowEntity», а затем попытаюсь десериализовать его, все будет хорошо и здорово.

Проблемы начинаются, когда я сохраняю объект типа List в кеше.Его результирующим типом является «System.Collections.Generic.List`1 [DataEntities.ShowEntity]», поэтому поиск ниже не удается, так как сборка содержит только DataEntities.ShowEntity, а результирующий тип не найден.В результате я получаю нулевое значение.

Я могу придумать некрасивое решение, в котором я анализирую строковый тип для префикса «Список» или «Перечисление», но должен быть более элегантный способ сделать это.Любой совет?

    private static Type GetGlobalType(string s)
    {
        Type t = null;
        Assembly[] av = AppDomain.CurrentDomain.GetAssemblies();
        foreach (Assembly a in av)
        {
            Type[] types = a.GetTypes();
             t = Type.GetType(s + "," + a.GetName());
             if (t == null)
             {
                  t = Type.GetType(s);
             }

             if (t != null)
                  break;
        }
        return t;
    }

1 Ответ

0 голосов
/ 14 марта 2012

Любая конкретная причина, по которой вы выполняете кастинг самостоятельно.Вы можете использовать неявное объявление, чтобы справиться с этим, используя простую сериализацию XML.

Когда класс десериализован, он автоматически установит правильный тип во время выполнения, нет необходимости в приведении.

        var dataIn = new List<DataEntities.ShowEntity>();            
        Console.WriteLine("Type before serialization: " + dataIn.GetType());

        var xs = new XmlSerializer(dataIn.GetType());            
        var xmlWriter = XmlWriter.Create(@"C:\test.xml");
        xs.Serialize(xmlWriter, dataIn);
        xmlWriter.Close();

        var xmlReader = XmlReader.Create(@"C:\test.xml");
        var dataOut = xs.Deserialize(xmlReader);
        xmlReader.Close();

        Console.WriteLine("Type after deserialization: " + dataOut.GetType());      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...