Аннотация :
Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Здравствуйте, Андрей Корявченко, Вы писали:
АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
А почему не использовались уже сушествующие механизмы конфигурации ?
Здравствуйте, Mikhail_T, Вы писали:
M_T>Здравствуйте, Андрей Корявченко, Вы писали:
АК>>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
M_T>А почему не использовались уже сушествующие механизмы конфигурации ?
Здравствуйте, Андрей Корявченко, Вы писали: АК>Конфигурирование .NET-приложений АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Классная статья.
Но есть несколько мелких шероховатостей
Почему бы вместо Singleton не использовать Double-Checked Locking
и не сделать все методы в классе Config статическими.
Ну и в
public static Config GetClone()
{
return (Config)instance.MemberwiseClone();
}
заменить instance на Instance?
Побольше таких статей.
Ну а может "задача работы в многопоточном режиме" сначала рассматривалась, а потом перестала рассматриваться, чтобы не "загромождать код ненужными наворотами"? Статья — бомба, идея — супер! Где тут можно получить распечатанную копию с автографом автора? Шутки-шутками, а статья — действительно очень нужная и полезная, побольше бы таких.
Здравствуйте, Андрей Корявченко, Вы писали:
АК>Статья :
АК>Авторы : АК>Андрей Корявченко
АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
вот захотелось мне передать эти настройки в PropertyGrid через Remoting.
и вываливается exception, дескать, AttributeCollection is not marked as serializable (это при реализации ICustomTypeDescriptor, т.к. без него вообще не захотело).
Здравствуйте, фонарь, Вы писали:
Ф>вот захотелось мне передать эти настройки в PropertyGrid через Remoting. Ф>и вываливается exception, дескать, AttributeCollection is not marked as serializable (это при реализации ICustomTypeDescriptor, т.к. без него вообще не захотело).
Ну наверное можно отнаследоваться от AttributeCollection и таки пометить ее как serializable. Но вобще то идея передавать я так понимаю по ссылке не очень хорошая. Лучше передавать сам конфиг по значению и все обертки делать уже на клиентской стороне.
Здравствуйте, AndrewVK, Вы писали:
AVK>Ну наверное можно отнаследоваться от AttributeCollection и таки пометить ее как serializable.
//да, я собственно так и делал
[Serializable]
public class MyAttrCollection : AttributeCollection
{
public MyAttrCollection() : base(null) {}
}
//а потом в реализации ICustomTypeDescriptor
AttributeCollection ICustomTypeDescriptor.GetAttributes()
{
return new MyAttrCollection();
}
оно все равно ругается, что not marked as serializable.
AVK>Но вобще то идея передавать я так понимаю по ссылке не очень хорошая. Лучше передавать сам конфиг по значению и все обертки делать уже на клиентской стороне.
Здравствуйте, Yuri, Вы писали:
Y>Вопрос: почему в свойстве IsReadOnly класса MyPropDesc возвращается false? По-моему правильнее было бы воазвращать _PropDesc.IsReadOnly.
Ну для конкретного проекта это не критично, а так вобще конечно ты прав.
Извините, туплю, а хочется побыстрее (в тч оттупиться).
Не работает, что-то подстановка имен в классе конфигурации со вложенными классами для свойств вложенных классов.
public class config
protected mobjA As new AClass
protected mobjB As new BClass
protected mstrDescription as New String
' работает
Public Property Description As string
' работает
Public Readonly Property A As AClass
....
end class
Public Class AClass
protected mstrName as new string
' не работает
Public Property Name As String
...
end class
Здравствуйте, olegbs, Вы писали:
O>Извините, туплю, а хочется побыстрее (в тч оттупиться). O>Не работает, что-то подстановка имен в классе конфигурации со вложенными классами для свойств вложенных классов.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, olegbs, Вы писали:
O>>Извините, туплю, а хочется побыстрее (в тч оттупиться). O>>Не работает, что-то подстановка имен в классе конфигурации со вложенными классами для свойств вложенных классов.
AVK>Что значит вложенных?
Я попробовал в сообщении это раскрыть, но видно, действительно, туплю :<
А имел я ввиду, что класс Config имеет в своем составе члена, который сам является классом и у него имеются свойства (вот для этих свойств хотелось бы увидеть русские названия)
Примерный текст класса ниже. Могу на С#, но только завтра набью, чтобы не было синтаксических ошибок.
public class Config
protected mobjA As new AClass
protected mstrDescription as New String' работаетPublic Property Description() As String
Get
Return mstrDescription
End Get
Set(ByVal Value As String)
mstrDescription = Value
End Set
End Property' работаетPublic Readonly Property A As AClass
Get
Return mobjA
End Get
End Property
end class
Public Class AClass
protected mstrName as new string' не работаетPublic Property Name As String
Get
Return mstrName
End Get
Set(ByVal Value As String)
mstrName = Value
End Set
End Property
...
end class
Здравствуйте, olegbs, Вы писали:
O>А имел я ввиду, что класс Config имеет в своем составе члена, который сам является классом и у него имеются свойства (вот для этих свойств хотелось бы увидеть русские названия)
А как ты их в гриде сможешь увидеть, он тебе для класса просто его имя выведет?
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, olegbs, Вы писали:
O>>А имел я ввиду, что класс Config имеет в своем составе члена, который сам является классом и у него имеются свойства (вот для этих свойств хотелось бы увидеть русские названия)
AVK>А как ты их в гриде сможешь увидеть, он тебе для класса просто его имя выведет?
<TypeConverter(GetType(MyStatusConverter))> _
Public Class AClass
...
End Class
Здравствуйте, olegbs, Вы писали:
AVK>>А как ты их в гриде сможешь увидеть, он тебе для класса просто его имя выведет?
O><TypeConverter(GetType(MyStatusConverter))> _ O>Public Class AClass O>... O>End Class
Не, ну что из тебя все клещами вытягивать приходится? В конвертере видимо реализован GetProperties? Тогда все понятно. Та версия что в журнале очень старая уже, в дальнейшем этот класс был сильно переработан. Свежая версия отрабатывает DisplayName и в таких случаях, и в enum и еще много чего интересного умеет. Брать как обычно, в CVS януса. Можно еще попробовать дернуть через subversion, адрес репозитория svn://rsdn.ru/Janus.
Спасибо, Андрей !
Моя тупость окончилась. А клещами тащить не надо, не хотел загружать форум тривиальными вещами ))
Задача разовая, поэтому не стал оборачивать класс, а сделал наследование от обертки, как для класса конфигурации, так и для вложенных. Часа два делал, потому что сам дурак, делал изменения, а в propertygrid показывал инстанцию первоначального класса.
Бывает
Удачи
Здравствуйте, Андрей Корявченко, Вы писали:
АК>Статья :
АК>Авторы : АК>Андрей Корявченко
АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Хочется добавить:
1. Использовать при XML серилизации таки нужно XmlTextReader/XmlTextWriter иначе буду проблеммы с национальными символами.
2. Можно упомянуть как десериализуется тип, если он не найден (массив елементов XmlAttribute и XmlElement)
3. Можно упомянуть о XmlDeserializationEvents (так как это вообще в MSDN не описано)
АК>Авторы : АК>Андрей Корявченко
АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
Здравствуйте, <Аноним>, Вы писали:
А>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
Если скачать исходники януса (http://rsdn.ru/projects/VcsStatus.aspx?project=janus), то там можно увидеть пример (свойство, которое содержит путь к звуковому файлу). Если лень разбираться, то смотреть классы EditorAttribute и UITypeEditor.
P.S. Скачать свежие исходники януса в любом случае стоит, поскольку PropertyGridCustomizer был существенно переделан с тех пор.
А>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
[Editor(typeof (FolderEditor), typeof (UITypeEditor))]
public string SomeFolder
{
get { return _someFolder; }
set { _someFolder = value; }
}
private class FolderEditor : FolderNameEditor
{
protected override void InitializeDialog(FolderBrowser fbd)
{
}
}
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Я бы изменил мир — но Бог не даёт исходников...
Re[3]: Конфигурирование .NET-приложений
От:
Аноним
Дата:
15.06.05 15:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, <Аноним>, Вы писали:
А>>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
AVK>Если скачать исходники януса (http://rsdn.ru/projects/VcsStatus.aspx?project=janus), то там можно увидеть пример (свойство, которое содержит путь к звуковому файлу). Если лень разбираться, то смотреть классы EditorAttribute и UITypeEditor.
AVK>P.S. Скачать свежие исходники януса в любом случае стоит, поскольку PropertyGridCustomizer был существенно переделан с тех пор.
Огромное спасибо, буду разбираться дальше.
Re[3]: Конфигурирование .NET-приложений
От:
Аноним
Дата:
15.06.05 17:59
Оценка:
Здравствуйте, Andre, Вы писали:
A>
A> [Editor(typeof (FolderEditor), typeof (UITypeEditor))]
A> public string SomeFolder
A> {
A> get { return _someFolder; }
A> set { _someFolder = value; }
A> }
A> private class FolderEditor : FolderNameEditor
A> {
A> protected override void InitializeDialog(FolderBrowser fbd)
A> {
A> }
A> }
A>
не могу понять. добавил:
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
пишет:
The type or namespace name 'FolderNameEditor' could not be found (are you missing a using directive or an assembly reference?)
почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design
А>почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design
Добавь в проекте референс на System.Design
... << RSDN@Home 1.1.4 beta 7 rev. 0>> :: silent
Я бы изменил мир — но Бог не даёт исходников...
Re[5]: Конфигурирование .NET-приложений
От:
Аноним
Дата:
15.06.05 19:02
Оценка:
Здравствуйте, Andre, Вы писали:
А>>почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design
A>Добавь в проекте референс на System.Design
АК>Авторы : АК>Андрей Корявченко
АК>Аннотация : АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
Нашли маленькую багу.
Всем, кто бездумно воспользовался кодом статьи, рекомендую почитать здесь
Пожалуйста, ответьте на тупой вопрос. Я прочитал статью несколько раз, но из-за некоторых ошибок в ДНК не могу разобраться самостоятельно. Как вообще правильно использовать этот синглтон-класс? Нельзя ли было в текст статьи добавить еще один короткий листинг?
Вот я добавляю свои атрибуты в тело класса, выше тэга [XmlIgnore], таким образом:
public static string pathToTTLibrary;
Код для инициализации этой переменной-члена я добавил сюда:
catch (Exception e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
pathToTTLibrary = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
}
Дальше я в определенном месте программы пытаюсь этот атрибут считать. Поскольку никаких конструкторов не указано, то у меня Config.pathToTTLibrary является null, независимо от того, вызываю я Config.Reload() перед этим, или нет. Что я должен был сделать, чтобы он не был null? Я не понимаю фразу "Для перезагрузки настроек достаточно обнулить поле instance. При следующем обращении настройки будут заново загружены с диска." Почему? Как именно нужно это "обращение" осуществить, чтобы чтение произошло?
Здравствуйте, Ник, Вы писали: Ник>Вот я добавляю свои атрибуты в тело класса, выше тэга [XmlIgnore], таким образом: Ник>public static string pathToTTLibrary;
Поля твоей конфигурации не должны быть статическими.
В коде можно использовать так:
string path = Config.Instance.pathToTTLibrary;
Ник>Дальше я в определенном месте программы пытаюсь этот атрибут считать. Поскольку никаких конструкторов не указано, то у меня Config.pathToTTLibrary является null, независимо от того, вызываю я Config.Reload() перед этим, или нет. Что я должен был сделать, чтобы он не был null? Я не понимаю фразу "Для перезагрузки настроек достаточно обнулить поле instance. При следующем обращении настройки будут заново загружены с диска." Почему? Как именно нужно это "обращение" осуществить, чтобы чтение произошло?
По моему ты не понял что такое Instance. Данный класс является синглтоном. Свойство Config.Instance при первом вызове создаёт и возвращает объект типа Config. В процессе создания он его десереализует из файла и сохраняет ссылку на него во внутреннем статическом поле instance. При последующих вызовах просто возвращает этот объект (design patern singlton). Таким образом если обнулить поле instance, то при следующем обращении к Config.Instance, объект будет заного создан (считан).
public static Config Instance
{
get
{
lock(lockFlag)
{
if(instance == null)
{
try
{
//Пытаемся загрузить файл с диска и десериализовать егоusing(FileStream fs =
new FileStream(LocalUser.GetDatabasePath()
+ "\\config.xml",FileMode.Open))
{
System.Xml.Serialization.XmlSerializer xs =
new System.Xml.Serialization.XmlSerializer(typeof(Config));
instance = (Config)xs.Deserialize(fs);
}
}
catch(Exception e)
{
//Если не удалось десериализовать то просто создаем новый экземпляр
instance = new Config();
}
}
}
return instance;
}
Здравствуйте, Ed.ward, Вы писали:
EW>У меня такой вопрос, был экземпляр класса сеарилизуемый в config.
EW>В след. версии программы в этом классе добавилась и убралась пара полей. EW>Как пройдет десериализация?
EW>Рухнет или новые поля просто инициируются значениями по умолчанию?
Если просто удалились/добавились, то да. Проблемы будут только с удалением/переименованием элементов enum и в смене типа свойст.
Здравствуйте, Ed.ward, Вы писали:
EW>Привет всем
EW>У меня такой вопрос, был экземпляр класса сеарилизуемый в config.
EW>В след. версии программы в этом классе добавилась и убралась пара полей. EW>Как пройдет десериализация?
EW>Рухнет или новые поля просто инициируются значениями по умолчанию?
Отсутствующие поля останутся инициализированы значениями по умолчанию.
Неизвестные ноды вызовут ошибку. Чтобы ее не было, можно в новой версии класса добавить специального мембера:
[XmlAnyElenent]
[Obsolete("Never access this member directly", true)]
public XmlElement[] Deprecated
{
get { return null;}
set { }
}
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, BlezAlex, Вы писали :
BA>сохраняются только public свойства, добавь по свойству на каждую BA>переменную, кот. нужно сохранить, и будет работать
Добавил.
Результат тот же самій. То же содержимое файла.
public class Config
{
//[XmlTextAttribute]public string spTest
{
get{return strTest22;}
set{strTest22=value;}
}
private string strTest22= "hello";
Любопытно
Скопировал твой первый исходник, все ОК, сохранилось.
Вобще я ошибся, это в propertyGrid отображаются только public свойства,
а сохранятся должны все..
"BlezAlex" <54356@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1894893@news.rsdn.ru... > Любопытно > Скопировал твой первый исходник, все ОК, сохранилось. > Вобще я ошибся, это в propertyGrid отображаются только public свойства, > а сохранятся должны все..
Да уж.
Действительно любопытно.
Что ли и себе скопировать?
Config cfg = new Config();
cfg.spTest="sasa";
cfg.Save();
"BlezAlex" <54356@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1894893@news.rsdn.ru... > Любопытно > Скопировал твой первый исходник, все ОК, сохранилось. > Вобще я ошибся, это в propertyGrid отображаются только public свойства, > а сохранятся должны все..
A>"BlezAlex" <54356@users.rsdn.ru> сообщил/сообщила в новостях следующее: A>news:1894975@news.rsdn.ru... >>а я так: >> Config.Instance.Save();
A>Спасибо! A>Заработало . A>Буду завтра разбираться в чем біл поинт. >> >> >> p.s. VS 2005
Поинт в том, что у Config нет public constructor который бы инициализировал instance. При вызове config.Save(), instance равен null и строчка xs.Serialize(fs,instance) сериализует ничто...
Вообще, я бы запретил использование new добавив пустой private constructor и тогда Config config = new Config() выдавало бы ошибку компиляции заставляя пользоваться Config config = Config.Instance.
" Варвар " <19277@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1896129@news.rsdn.ru... > Здравствуйте, alexdp, Вы писали: > > > A>"BlezAlex" <54356@users.rsdn.ru> сообщил/сообщила в новостях следующее: > A>news:1894975@news.rsdn.ru...
> Поинт в том, что у Config нет public constructor который бы > инициализировал instance. При вызове config.Save(), instance равен null и > строчка xs.Serialize(fs,instance) сериализует ничто... > Вообще, я бы запретил использование new добавив пустой private constructor > и тогда Config config = new Config() выдавало бы ошибку > > > компиляции > заставляя пользоваться Config config = Config.Instance.
Понятно. Спасибо.
Но все таки, где брать LocalUser.GetDatabasePath()
Здравствуйте, alexdp, Вы писали:
A>Но все таки, где брать LocalUser.GetDatabasePath()
Пример в статье выдернут из реального проекта в котором был класс LocalUser. Он тебе не нужен. Тебе нужен путь к директории в которой лежит конфигурационный файл. Обычно это таже директория в которой лежит exe. Можно воспользоваться Environment.CurrentDirectory.
" Варвар " <19277@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1902335@news.rsdn.ru... > Здравствуйте, alexdp, Вы писали: > > A>Но все таки, где брать LocalUser.GetDatabasePath() > > Пример в статье выдернут из реального проекта в котором был класс > LocalUser. Он тебе не нужен. Тебе нужен путь к директории в которой лежит > конфигурационный файл. Обычно это таже директория в которой лежит exe. > Можно воспользоваться Environment.CurrentDirectory.
Спасибо за объяснение.
CurrentDirectory вполне подойдет.
Здравствуйте, Варвар, Вы писали:
В>Пример в статье выдернут из реального проекта в котором был класс LocalUser. Он тебе не нужен. Тебе нужен путь к директории в которой лежит конфигурационный файл. Обычно это таже директория в которой лежит exe. Можно воспользоваться Environment.CurrentDirectory.
Не надо учить плохому, лучше в Application Data создать папку от программы и там хранить конфиги. Но не рядом с исполняемым файлом — у пользователя может не хватить прав на запись. Если это конечно не приложение для себя.
... <<My edition based on RSDN@Home 1.2.0 alpha rev. 648>>
В задаче спрашивается:
Сколько вытечет портвейна из открытого бассейна?
Здравствуйте, stele, Вы писали:
S>Здравствуйте, Варвар, Вы писали:
В>>Пример в статье выдернут из реального проекта в котором был класс LocalUser. Он тебе не нужен. Тебе нужен путь к директории в которой лежит конфигурационный файл. Обычно это таже директория в которой лежит exe. Можно воспользоваться Environment.CurrentDirectory.
S>Не надо учить плохому, лучше в Application Data создать папку от программы и там хранить конфиги. Но не рядом с исполняемым файлом — у пользователя может не хватить прав на запись. Если это конечно не приложение для себя.
Для учебных целей сойдёт, а для реального приложения пути к конфигурационным файлам и типы соотвествуюших им классов прописываются в специальном секшене в app.config, для которого пишется специальный ConfigurationSectionHandler, которым пользуется специальный ConfigManager, управляющий всеми конфигами в апликации, в котором и имплементируется (один раз) превращение конфиг файла в объект соответствующего класса (и наоборот). Но это в реальном приложении, а для учебных целей сойдёт и то что описано в статье
Кстати... Как получть путь к Application Data?
Здравствуйте, Варвар, Вы писали:
В> Но это в реальном приложении, а для учебных целей сойдёт и то что описано в статье
В статье всё нормально. Я о другом. Я о том, что тебе предложили и ты согласился хранить файл с настройками рядом со своей программой. Лучше сразу тренироваться как в бою и не привыкать к порочной практике — тебе проще файл настроек рядом уронить, а проблему от этого получит сапорт и пользователь.
В>Кстати... Как получть путь к Application Data?
смотри System.Environment.GetFolderPath
... <<My edition based on RSDN@Home 1.2.0 alpha rev. 648>>
В задаче спрашивается:
Сколько вытечет портвейна из открытого бассейна?
Здравствуйте, stele, Вы писали:
В>> Я о том, что тебе предложили и ты согласился хранить файл с настройками рядом со своей программой.
Предложили не мне, а я. Как самый простой способ для тестовой програмки. Согласен, что не самый верный. Хотя бы потому что CurrentDirectory во время выполнения может и поменяться...
В>>Кстати... Как получть путь к Application Data? S>смотри System.Environment.GetFolderPath
Спасибо. Буду знать
Здравствуйте, Варвар, Вы писали:
В>Предложили не мне, а я.
Хм, и в правду ты предложил, обознался.
В>Как самый простой способ для тестовой програмки. Согласен, что не самый верный. Хотя бы потому что CurrentDirectory во время выполнения может и поменяться...
Точно.
... <<My edition based on RSDN@Home 1.2.0 alpha rev. 648>>
В задаче спрашивается:
Сколько вытечет портвейна из открытого бассейна?
Статья замечательная. А можно поподробней на счет вот этой штуки
private static XmlSerializer CreateSerializer()
{
ArrayList res = new ArrayList();
foreach(DictionaryEntry de in PluginManager.Instance.ConfigurablePlugins)
res.Add(((IConfigurablePlugin)de.Value).Config.GetType());
return new XmlSerializer(typeof(Config), (Type[])res.ToArray(typeof(Type)));
}
Хочется сделать универсальный Config-класс для различных приложений и Config, естественно, будет меняться от одного к другому. Как тут быть? Понятно что как-то конфигу надо говорить какие типы он будет сериализовывать. А вот дальше ...
Здравствуйте, sleepwalker, Вы писали:
S>Хочется сделать универсальный Config-класс для различных приложений и Config, естественно, будет меняться от одного к другому. Как тут быть?
Простого ответа на этот вопрос у меня нет. А сложный на статью тянет, если не больше.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, sleepwalker, Вы писали:
S>>Хочется сделать универсальный Config-класс для различных приложений и Config, естественно, будет меняться от одного к другому. Как тут быть?
AVK>Простого ответа на этот вопрос у меня нет. А сложный на статью тянет, если не больше.
А хотябы ссылочки каки-нить кинуть? )) Можна и на буржуйском. Наверняка есть что-то.
ЗЫ
У меня пока одна мысль сделать генерик Config<T>(), где то самое T и будет конкертика для конкретного приложения.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, sleepwalker, Вы писали:
S>>А хотябы ссылочки каки-нить кинуть? )) Можна и на буржуйском. Наверняка есть что-то.
AVK>Ссылочков нету. Есть частично готовый код, но без документации, и частично портированный на C# 3. Если интересно, могу выслать на мыло.
Очень интересно.
Если не жалко, sleepwalker@ngs.ru, буду признателен и всякое такое. :)
S>>ЗЫ S>>У меня пока одна мысль сделать генерик Config<T>(), где то самое T и будет конкертика для конкретного приложения.
AVK>Это ничего особого не даст. Экономить на паре строчек подъема XmlSerializer не вижу смысла.
Ну пара не пара. Со всякими фенечками и обработками там вылазит около сотни этих самых строчек. Хотя, конечно, хочется, чтобы было все красиво )
Здравствуйте, AndrewVK, Вы писали:
AVK>Есть частично готовый код, но без документации, и частично портированный на C# 3. Если интересно, могу выслать на мыло.
Интересно. Заранее благодарен.
Что-то немного не догоняю: а зачем класс PropDispNameWrapper и вообще весь этот длиннющий исходник в разделе "Изменение названий свойств в PropertyGrid"?..
Чем не устраивает стандартный атрибут "DisplayName" из System.ComponentModel?..
Изучил вашу статью — оч. полезная оказалась, как раз стоит такая задача у меня.
Нужно в xml файле хранить информацию о контроллах, которые будут динамически загружаться на форму при запуске программы.
Т.е. храним тип контролла, расположение, размеры и проч. Я сделал этот файл с помощью DataTable(в которой 1строка — 1 контролл, ячейки — свойства контролла) и XmlSerializer.
А как можно было бы для решения использовать Ваш класс Config.
Здравствуйте, Андрей Корявченко, Вы писали:
АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....
в статье приведен пример генерируемого XML файла конфигурации
[Category("Application")]
[DefaultValue("Title1")]
[Description("Enter Title for the application")]
свойств
public string Title
{
get { return _Title; }
set { _Title = (string) value; }
}
класса конфигурации участвуют в сиреализации?
по статье я создал примерчик (без использования синглтона) Сериализация класса для PropertyGrid. По результатам выполнения которого следует, что атрибуты при сериализации не используются. Как тогда у вас образовалась иерархия в xml конфиге?
Насколько я помню эти атрибуты участвуют в отображении данного конфига в редакторе (в формочке) PropertyGrid. Эти атрибуты указывают как xml будет биндится к PropertyGrid (какое будет дефолтное значение, как будет выглядеть и т.п.)