Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Способ загрузки объекта из самого объекта 
V
    Опции темы
dazy
Дата 28.4.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 1
Всего: 8



Объект хранится в xml. Как я могу загрузить этот объект средствами самого объекта?

Сейчас я делаю примерно так:
Код

var o = new Layout();
o = (Layout)XMLSerializerExtension.LoadFromXMLFile(o.GetType(), fileName);


а хотелось бы получить что-то вида o.LoadFromXMLFile(fileName)

Проблема в том, что внутри o.LoadFromXMLFile, я конечно загружу новый объект из файла, но как сделать так, чтобы this был равен этому объекту?

Похоже, что надо применять рефлекшн, но я не знаю как. Научите, кто умеет.
PM MAIL   Вверх
Bogdan1024
Дата 28.4.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



шо-то я не понял
Зачем загружать объект с помощью уже существующего объекта, который уже загружен?


--------------------
user posted image
PM MAIL   Вверх
dazy
Дата 28.4.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 1
Всего: 8



Ну, я конечно его сначала создаю, var o = new Layout(); но он дефолтный, пустой.
А потом хотел бы загрузить все его пропертиесы из файла, что-то вроде  o.LoadFromXMLFile(fileName).

Ну или можно конструктор прописать, чтобы при создании объекта он свои свойства загружал из вне.
PM MAIL   Вверх
Bogdan1024
Дата 28.4.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



Код

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    [Serializable]
    public class Layout
    {
        public void Load(string filename)
        {
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            System.IO.FileStream fs = new System.IO.FileStream(filename,  System.IO.FileMode.Open, System.IO.FileAccess.Read);
            Layout l = (Layout)bf.Deserialize(fs);
            fs.Close();
            this.zlo = l.zlo;
        }
        public string zlo = "AAA!!!";
    }
}


Код

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Layout l1 = new Layout();
            l1.zlo = "OOOO!!!";
            System.IO.FileStream fs = new System.IO.FileStream("Layout.bin", System.IO.FileMode.Create, System.IO.FileAccess.Write);
            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            bf.Serialize(fs, l1);
            fs.Close();

            Layout l2 = new Layout();
            System.Console.WriteLine(l2.zlo);
            l2.Load("Layout.bin");
            System.Console.WriteLine(l2.zlo);
            System.Console.ReadKey();
        }
    }
}

Чем это не подходит? Зачем юзать рефлексию?


--------------------
user posted image
PM MAIL   Вверх
Rififi
Дата 28.4.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 5
Всего: 36



Bogdan1024, 
reflection удобнее когда пропертей с десяток-другой.

также можно заюзать extension методы, тогда запись чуть покороче будет:
Код
Layout l = new object().Load<Layout>("");


    public static class ObjectExt
    {
        public static T Load<T>(this object obj, string s) where T : new()
        {
            ...
        }
    }

PM MAIL   Вверх
Bogdan1024
Дата 28.4.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



рэфлэкшн медленнее обычного присваивания в раз эдак 10 000 
это "удобство" того не стоит даже если свойств мульйон
лучше нагенерить с помощью рэфлэкшна код если лень самому писать присвоения


--------------------
user posted image
PM MAIL   Вверх
-Mikle-
Дата 28.4.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Если объект не может находиться в состоянии, как вы сказали "пустой", то он не должен иметь дефолтного конструктора без параметров. Либо он не должен вообще иметь публичного конструктора, а иметь статический метод типа
Код

    Class c = Class.FromXml(...);

Ну, по крайней мере, это будет логичнее.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dazy
Дата 28.4.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 1
Всего: 8



Цитата

Чем это не подходит? Зачем юзать рефлексию?


Это, как раз то что я могу сделать. Но это не подходит тем, что если в классе я добавляю/изменяю свойство, то придется делать изменения в Load. Мне кажется такой подход не очень хорош.

PM MAIL   Вверх
dazy
Дата 28.4.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 1
Всего: 8



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

Все же экстеншн
Код

    public static class ObjectExt
    {
        public static T Load<T>(this object obj, string s) where T : new()
        {
            return (T)XMLSerializerExtension.LoadFromXMLFile(obj.GetType(), s);

        }
    }
 

Вызов в коде
Код

var o = new Layout().Load<Layout>(fileName);


Большое всем спасибо!
Надеюсь я ничего не  напортачил.
PM MAIL   Вверх
Rififi
Дата 28.4.2009, 22:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 5
Всего: 36



Bogdan1024, 
рэфлэкшн медленнее обычного присваивания в раз эдак 10 000 
Сам замерял?
Вот будет скорость загрузки объекта узким местом в работе всей программы, вот тогда будем думать. а пока даже задницу от стула не оторву (((:

new Layout()
это лишнее.
можно даже так:
Код
"Йоу, братан!".Load<Layout>(fileName);
smile


Это сообщение отредактировал(а) Rififi - 28.4.2009, 22:11
PM MAIL   Вверх
dazy
Дата 29.4.2009, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 1
Всего: 8



Цитата

new Layout()
это лишнее.
можно даже так:
"Йоу, братан!".Load<Layout>(fileName);


Не понял. И это  "Йоу, братан!" сразу станет типом Layout? 


PM MAIL   Вверх
-Mikle-
Дата 29.4.2009, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Я понимаю что вопрос решен, но не могу удержаться: разве вот это не красивее выглядит?

var o = ObjectLoader.Load<Layout>(fileName);

Реализуется так:
Код

public static class ObjectLoader
{
    public static T Load<T>(string fileName) where T: new()
    {
        return (T)XMLSerializerExtension.LoadFromXMLFile(typeof(T), fileName);
    }
}


Скажу более, в твоем решении есть косяк: для того, чтоб сделать доступным Extension method ты создаешь экземпляр класса, а потом вызываешь метод, который возвращает тебе новый экземпляр класса!!!

Попробуй проверить это и ты убедишься сам в этом:
Код

    Layout layout1 = new Layout();
    Layout layout2 = layout1.Load<Layout>(fileName);
    bool result = object.ReferenceEquals(layout1, layout2); // false




--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
dazy
Дата 29.4.2009, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 15.9.2006

Репутация: 1
Всего: 8



Цитата

Попробуй проверить это и ты убедишься сам в этом:


Убедил.
PM MAIL   Вверх
-Mikle-
Дата 29.4.2009, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(dazy @  29.4.2009,  11:41 Найти цитируемый пост)
Убедил

Рад был помочь! Спасибо за плюсик smile


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Bogdan1024
Дата 29.4.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



Цитата(Rififi @  28.4.2009,  21:11 Найти цитируемый пост)
рэфлэкшн медленнее обычного присваивания в раз эдак 10 000 Сам замерял?

Да  smile 


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.