Обращение к параметрам
От: RealDammit  
Дата: 14.12.06 11:26
Оценка:
Всем доброго времени суток.

Основной смысл проекта: INI-файлы на XML, с любым уровнем вложенности.

Проблема: с XML сложностей нет, сложности есть с обращением к параметрам в программном коде.
Я использую методы типа
xml.SetParameter("window.border.width", 10);
и
width = xml.GetParameter("window.border.width"),

таких методов 4 варианта (для значений типа string,long, double и binary). А передо мной стоит задание
сделать это более удобным способом, например

xml["window"]["border"]["width"] = 10;
или
xml.border.width = 10;
, в случае записи параметра в файл.



text = xml["window"]["border"]["width"];
или
text = xml.border.width;
, в случае получения параметра из файла.

Какую струтуру данных использовать для таких обращений ?

Я вообще в прострации. Даже не знаю в каком направлении начинать копать, буду очень признателен любым содействиям.
Re: Обращение к параметрам
От: vitaly_spb Россия  
Дата: 14.12.06 11:31
Оценка:
RD>Какую струтуру данных использовать для таких обращений ?

в твоем случае возможно имеет смысл попробовать типизированные датасеты. ну или самому выражать всю структуру в объектах.
...Ei incumbit probatio, qui dicit, non qui negat...
Re[2]: Обращение к параметрам
От: RealDammit  
Дата: 14.12.06 11:37
Оценка:
RD>>в твоем случае возможно имеет смысл попробовать типизированные датасеты

сейчас попробуем разобраться, что такое
Re[2]: Обращение к параметрам
От: RealDammit  
Дата: 14.12.06 12:00
Оценка:
RD>>ну или самому выражать всю структуру в объектах.

а это как, можно небольшой примерчик ?
Re[3]: Обращение к параметрам
От: vitaly_spb Россия  
Дата: 14.12.06 12:05
Оценка:
RD>а это как, можно небольшой примерчик ?

например, сделай тестовый xml и воспользуйся утилитой xsd.exe (в директории куда установил студию \SDK\%version%\Bin), она должна по xml нагенерить классы.
...Ei incumbit probatio, qui dicit, non qui negat...
Re: Обращение к параметрам
От: Andrew_ImP  
Дата: 14.12.06 12:11
Оценка:
Здравствуйте, RealDammit, Вы писали:

RD>Всем доброго времени суток.

. . .
RD>Я использую методы типа
RD>
RD>xml.SetParameter("window.border.width", 10); 
RD>
и

RD>
RD>width = xml.GetParameter("window.border.width"),
RD>


RD>таких методов 4 варианта (для значений типа string,long, double и binary). А передо мной стоит задание

RD>сделать это более удобным способом, например

RD>
RD>xml["window"]["border"]["width"] = 10;
RD>


RD>
RD>text = xml["window"]["border"]["width"];
RD>


Извините за спам и т.д. пишу как бы "джаст фор фан"

class Test
{
    public class Foo
    {
        public void SetParameter(string path, int value)
        {
            Console.WriteLine("Set>{0} : {1}", path, value);
        }
        public int GetParameter(string path)
        {
            int resultValue = 1;
            Console.WriteLine("Get>{0} : {1}", path, resultValue);
            return resultValue;
        }
    }
    public class Poo
    {
        public static Poo Create(Foo foo)
        {
            if (foo == null)
                throw new ArgumentNullException("foo");
            return new Poo(String.Empty, 0, foo);
        }
        private Poo(string prefix, int value, Foo foo)
        {
            _prefix = prefix;
            _value = value;
            _foo = foo;
        }
        public Poo this[string path]
        {
            get 
            {
                if (_foo != null)
                    return new Poo(String.Format("{0}.{1}", _prefix, path), 0, _foo);
                else
                    return null; // or throw exception :)
            }
            set
            {
                if (_foo != null)
                {
                    if (value._foo == null)
                    {
                        _foo.SetParameter(String.Format("{0}.{1}", _prefix, path), value._value);
                    }
                    else
                        throw new Exception(); // can't set any non leaf object :)
                }
                else
                    throw new Exception();
            }
        }
        public static implicit operator Poo(int value)
        {
            return new Poo(String.Empty, value, null);
        }
        public static implicit operator int(Poo poo)
        {
            if (poo._foo != null)
                return poo._foo.GetParameter(poo._prefix);
            else
                throw new InvalidCastException();
        }
        string _prefix;
        Foo _foo;
        int _value;
    }

    static void Main(string[] args)
    {
        Foo foo = new Foo();
        Poo poo = Poo.Create(foo);
        poo["A"]["B"] = 2;
        int z = poo["Z"]["X"]["xxx"];
        Console.ReadKey();
    }
}


В точности соответствует тому что ты хотел получить
Re[2]: Обращение к параметрам
От: RealDammit  
Дата: 14.12.06 19:44
Оценка:
Andrew_ImP, огромное спасибо за твой "джаст фор фан", это на самом деле то, что я хотел получить

PS: названия классов — вещь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.