Как создать пользовательские классы System.Linq.Expression в C #? - PullRequest
4 голосов
/ 11 июня 2009

Можно ли создавать собственные классы Expression? Если да, есть ли у кого-нибудь примеры? Наследование от каркаса абстрактного класса Expression создает проблему, заключающуюся в том, что его конструктор принимает параметр ExpressionType, который является типом перечисления фреймворка.

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 01 июля 2009

С .net 3.5 вы не можете сделать это, потому что конструктор Expression принимает значение перечисления ExpressionType, и вы не можете добавлять новые типы узлов в перечисление.

Вы также не можете перегрузить существующий тип узла, потому что вы не можете наследовать ни от одного из "листовых классов" (например, BinaryExpression), потому что все они запечатаны.

Согласно документам MSDN, похоже, что вы можете сделать это в CLR v4, если вы переопределите метод "Reduce" и используете тип узла ExpressionType.Extension.

1 голос
/ 11 июня 2009

Это именно то, что должен был делать код DLR на codeplex; в конце концов, они воссоздали всю кодовую базу в другом пространстве имен (IIRC), пока не будет доставлено 4.0.

Это не обязательно хорошо работает с компилятором C #; Я, честно говоря, не пробовал.

0 голосов
/ 03 июня 2010

Я тоже не пробовал этого, но согласен с утверждением Скотта, что это должно работать в 4.0.

В частности, спецификация дерева выражений в CodePlex говорит о свойстве NodeType:

Производные выражения, которые не являются в общем наборе узлов в .NET должен вернуть вид узла Extension

0 голосов
/ 11 июня 2009

Я не верю, что вы можете расширить Expression, но я думаю, что вы могли бы добавить пару методов расширения для создания деревьев выражений, чтобы упростить генерацию.

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

...