ExpressionBuilder возвращает любой тип объекта - PullRequest
1 голос
/ 16 февраля 2010

Приведенный ниже код отлично работает для примитивных выражений (нет ничего удивительного)

public class SiteContextExpressionBuilder : ExpressionBuilder {
   public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) {
      PropertyInfo property = typeof(SiteContext).GetProperty(entry.Expression);
      return new CodePrimitiveExpression(property.GetValue(null, null)));
   }
}

Теперь я хотел бы также вернуть не примитивные типы. Скажем, объект Компании.
Как это работает? Кажется, я не могу найти хороших примеров.

Неверный тип примитива: ... Рассмотреть возможность использования CodeObjectCreateExpression

Как мне реализовать CodeObjectCreateExpression или альтернативу?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2010

Я не знаю, как выглядит конструктор для вашего объекта Company, поэтому вот пример с размером:

Конструктор

new Size(640, 400)

С CodeObjectCreateExpression

CodeExpression newSizeExpr = new CodeObjectCreateExpression(new CodeTypeReference(“System.Drawing.Size”),
   new CodePrimitiveExpression(640), new CodePrimitiveExpression(400));

Если конструктор вашей компании принимает примитивные аргументы, вы можете просто использовать CodePrimitiveExpressions, как в приведенном выше примере.Если это требует не примитивных типов, вы можете создать экземпляры этих не примитивных типов с CodePrimitiveExpressions.Выполняйте упражнение до тех пор, пока у вас не будет того, что вам нужно для создания объекта вашей компании.

Обновление : Источник может быть полезен: http://blogs.msdn.com/bclteam/archive/2006/04/10/571096.aspx

1 голос
/ 25 февраля 2010

Вам следует взглянуть на подклассы CodeExpression, например CodePropertyReferenceExpression, чтобы использовать свойство и CodeVariableReferenceExpression, чтобы получить экземпляр.

CodeExpressions - низкоуровневое представление не зависящих от языка операторов и выражений. Вы должны разложить эквивалентные операторы C # на очень примитивные компоненты.

...