Универсальное преобразование типов - PullRequest
1 голос
/ 01 августа 2011

Предполагая, что у меня есть таблица Entities со столбцами Значение и Тип как varchar (строки) в базе данных, как бы я мог загрузить эти значения в C # и преобразовать втип указан в таблице?Я собирался сохранить результат getType для значения Type.

Ответы [ 4 ]

1 голос
/ 01 августа 2011

Как вы читаете из вашей базы данных? Используете ли вы ADO.NET или какой-либо тип OR Mapper, например EF или NHibernate? В случае OR Mapping вы могли бы создать строго типизированный объект, который мог бы определять типы ... Сам преобразователь OR отвечает за приведение.

1 голос
/ 01 августа 2011

Вы можете сделать это с помощью Activator.CreateInstance Метод для примера кода (который очень похож на ваш случай), см. Пример MSDN, связанный выше.

1 голос
/ 01 августа 2011

Сохраните value.GetType().AssemblyQualifiedName в столбце Type, а затем используйте Type.GetType(asmQualfName), чтобы получить тип обратно при загрузке из БД.После этого вы можете просто использовать Activator.CreateInstance, чтобы получить объект правильного типа.

0 голосов
/ 01 августа 2011

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

    using System.Xml.Serialization;

    public class MySettings
    {
    public String Setting1 { get; set; }
    public int Setting2 { get; set; }

    public String ToXml()
    {
        string settingsXml;
        var xmlSerializer = new XmlSerializer(typeof(MySettings));
        using (var stream = new MemoryStream())
        {
            xmlSerializer.Serialize(stream, this);
            stream.Position = 0;
            using(var reader = new StreamReader(stream))
            {
                settingsXml = reader.ReadToEnd();
            }
        }
        return settingsXml;
    }

    public static MySettings FromXml(string xml)
    {
        MySettings settings = null;
        using(MemoryStream stream  = new MemoryStream(System.Text.Encoding.Default.GetBytes(xml)))
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof (MySettings));
            settings = (MySettings) xmlSerializer.Deserialize(stream);
        }
        return settings;
    }
}
...