Показаны сообщения с ярлыком LINQ. Показать все сообщения
Показаны сообщения с ярлыком LINQ. Показать все сообщения

понедельник, 27 декабря 2010 г.

Знакомство с Dynamic LINQ

- Dynamic LINQ, знакомьтесь, это мои читатели.
- Читатели, знакомьтесь, это Dynamic LINQ.    
                           Знакомство читателей с Dynamic LINQ

Статическая типизация – это классно! Ведь чем больше ошибок мы сможем отловить во время компиляции, тем меньше их останется во время выполнения. С этими высказываниями спорить сложно, но если внимательно посмотреть на окружающие нас языки программирования, то можно с легкостью заметить, что нас окружает масса динамически типизированных языков, которые отлично справляются с теми задачами, с которыми статически типизированные языки справляются хуже. Такое положение вещей, как бы намекает на то, что статическая типизация не является панацеей и компилятор и всяческие анализаторы не могут предотвратить все изощренные способы получения нелепых или некорректных результатов, которые могут прийти в светлые головы наших коллег по цеху. В то же время как динамическая типизация в ряде случаев обладает явными преимуществами и является более подходящим средством решения некоторых задач.

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

вторник, 2 декабря 2008 г.

LINQ to XML правда здорово?

В последнее время я работаю над корпоративным приложением, которое состоит из серверной части и из нескольких клиентских. Для логгирования работы этих приложений используюется замечательный инструмент log4net. Его использование обусловлено не тем, что у нас продвинутые пользователи и они будут смотреть, как наше приложение работает, а исключительно удобством решения проблем непосредственно у клиента. Идея предложить пользователю открыть far и ручками поменять logLevel, как-то не вдохновляет, поэтому возникла идея настройки уровней логгирования программным способом. Для этой цели как нельзя лучше подошли новые инструменты в виде LINQ to XML.

// Вызов ToList обусловлен устранением отложенности

// операции Select

var configFiles = (from fn in

                   Directory.GetFiles(Application.StartupPath, "*.log4net").ToList()

                   select new {Filename = fn, Xml = XDocument.Load(fn)}).ToList();

// Здесь я получаю набо объектов анонимного класса, которые

// содержат имя конифгурационного файла, имя логгера, уровень

// логгирования, а также атрибут, который нужен для обновления

// уровня логгирования

var loggers = from cf in configFiles

              from lvl in cf.Xml.Descendants("level")

              let fi = new FileInfo(cf.Filename)

              select new { Filename = fi.Name,

                  Logger = (string)lvl.Parent.Attribute("name"),

                  Level = (string)lvl.Attribute("value"),             

                  Attribute = lvl.Attribute("value")};

//Обновление также не составляет труда!

foreach (var l in loggers)

{    

    l.Attribute.SetValue("INFO");

}

//Теперь нужно сохранить все конфиги обратно

foreach (var cfg in configFiles)

{    

    cfg.Xml.Save(cfg.Filename);

}

Кратко, понятно и вообще этот код прекрасно демонстрирует преимущества декларативного стиля программирования над императивным!