Comments 16
You are not a Sane, you are insane :)
В хорошем смысле :)
В хорошем смысле :)
+9
Я тоже использую данный подход в своём проекте. Однако, не понимаю, почему разработчики C# не могли добавить нативную поддержку разворачивания экспрешнов в язык. Лично я не вижу никаких концептуальных проблем. В вашем примере
Expression<Func<int, int, int, int>> g = (a, b, c) => f(a+b,b)*c;
f не может быть воспринята никак, кроме вызова делегата, а значит её можно подставить в экспрешн. Было бы круто =)+2
Можно спросить Липперта, но я думаю, он ответит, что просто незачем.
0
Ну, наверное, потому, что экспрешены — всё же навеска. Кроме того, это хороший задел добавить фичу в следующую версию шорпия :)
0
Я бы не сказал, что expression — это навеска. Это мощный инструмент, на основе которого построен LINQ2* и, например, в .net 4 экспрешенны получили достаточно сильное развитие вполть до возможности представлять в expressions целые методы.
+1
Есть опыт написание подобного визитора, но только для иных целей:
Полученные выражения могут использоваться как для IQueryable так и для IEnumerable, если инетерсно — могу попробовать написать статью :)
Полученные выражения могут использоваться как для IQueryable так и для IEnumerable, если инетерсно — могу попробовать написать статью :)
+2
В смысле безопасно использованы: добавляетяс проверка на null
0
А можно в двух словах, для чего конкретно?
+1
наиример, есть экспрешен вида:
Если передавать это в IQueryable — все будет хорошо. Есди сделать f.Compile().Invoke(new Entity()) — получим NullReferenceException если какое-то поле в цепочке будет Null.
Мой Visitor превращает такое выражение во что-то типа
Expression<Func<Entity, bool>> f = (e) => e.Field.Other.Name == "qwe";
Если передавать это в IQueryable — все будет хорошо. Есди сделать f.Compile().Invoke(new Entity()) — получим NullReferenceException если какое-то поле в цепочке будет Null.
Мой Visitor превращает такое выражение во что-то типа
Expression<Func<Entity, bool>> f = (e) => e != nul && e.Field != null && e.Field.Other != null && e.Field.Other.Name == "qwe";
+2
использую в своих проектах этот подход, вполне читаем, легко был понят коллегами.
//Groovy:
bossName = Employee?.Supervisor?.Manager?.Boss?.Name
//C#:
bossName = Nullify.Get(Employee, e => e.Supervisor, s => s.Manager, m => m.Boss, b => b.Name);
0
А чем вы рисовали такую красивую схему?
+2
Клево, но такие подходы интересны небольших приложений, а на практике, когда дело доходит до бизнес функции, советую использовать Specification Pattern, который можно легко тестировать и внести в документацию на систему.
+1
Sign up to leave a comment.
Аппликация Expressions