Поделиться через


ExpressionBuilder Класс

Определение

Вычисляет выражения во время синтаксического анализа страниц.

public ref class ExpressionBuilder abstract
public abstract class ExpressionBuilder
type ExpressionBuilder = class
Public MustInherit Class ExpressionBuilder
Наследование
ExpressionBuilder
Производный

Примеры

В следующих примерах кода показано, как создать построитель пользовательских выражений, реализуя абстрактный ExpressionBuilder класс. Эта реализация ExpressionBuilder возвращает вычисляемую инструкцию, передаваемую выражению. Чтобы запустить этот пример, необходимо сначала зарегистрировать построитель пользовательских выражений в файле Web.config. В первом примере кода показано, как зарегистрировать построитель пользовательских выражений в файле Web.config.

<configuration>
    <system.web>
       <compilation>
          <expressionBuilders>
              <add expressionPrefix="MyCustomExpression"
               type="MyCustomExpressionBuilder"/>
          </expressionBuilders>
       </compilation>
    </system.web>
</configuration>

Второй пример кода демонстрирует, как ссылаться на выражение в файле .aspx.

<asp:Label ID="Label1" runat="server"
Text="<%$ MyCustomExpression:Hello, world! %>" />

Третий пример кода демонстрирует, как разработать настраиваемый построитель выражений, производный от ExpressionBuilder. Чтобы запустить этот пример кода, необходимо поместить класс в папку App_Code.

using System;
using System.CodeDom;
using System.Web.UI;
using System.ComponentModel;
using System.Web.Compilation;
using System.Web.UI.Design;

// Apply ExpressionEditorAttributes to allow the 
// expression to appear in the designer.
[ExpressionPrefix("MyCustomExpression")]
[ExpressionEditor("MyCustomExpressionEditor")]
public class MyExpressionBuilder : ExpressionBuilder
{
    // Create a method that will return the result 
    // set for the expression argument.
    public static object GetEvalData(string expression, Type target, string entry)
    {
        return expression;
    }

    public override object EvaluateExpression(object target, BoundPropertyEntry entry, 
    object parsedData, ExpressionBuilderContext context)
    {
        return GetEvalData(entry.Expression, target.GetType(), entry.Name);
    }

    public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, 
    object parsedData, ExpressionBuilderContext context)
    {
        Type type1 = entry.DeclaringType;
        PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(type1)[entry.PropertyInfo.Name];
        CodeExpression[] expressionArray1 = new CodeExpression[3];
        expressionArray1[0] = new CodePrimitiveExpression(entry.Expression.Trim());
        expressionArray1[1] = new CodeTypeOfExpression(type1);
        expressionArray1[2] = new CodePrimitiveExpression(entry.Name);
        return new CodeCastExpression(descriptor1.PropertyType, new CodeMethodInvokeExpression(new 
       CodeTypeReferenceExpression(base.GetType()), "GetEvalData", expressionArray1));
    }

    public override bool SupportsEvaluate
    {
        get { return true; }
    }
}
Imports System.CodeDom
Imports System.Web.UI
Imports System.ComponentModel
Imports System.Web.Compilation
Imports System.Web.UI.Design

' Apply ExpressionEditorAttributes to allow the 
' expression to appear in the designer.
<ExpressionPrefix("MyCustomExpression")> _
<ExpressionEditor("MyCustomExpressionEditor")> _
Public Class MyExpressionBuilder
    Inherits ExpressionBuilder
    ' Create a method that will return the result 
    ' set for the expression argument.
    Public Shared Function GetEvalData(ByVal expression As String, _
       ByVal target As Type, ByVal entry As String) As Object
        Return expression
    End Function

    Public Overrides Function EvaluateExpression(ByVal target As Object, _
       ByVal entry As BoundPropertyEntry, ByVal parsedData As Object, _
       ByVal context As ExpressionBuilderContext) As Object
        Return GetEvalData(entry.Expression, target.GetType(), entry.Name)
    End Function

    Public Overrides Function GetCodeExpression(ByVal entry _
       As BoundPropertyEntry, ByVal parsedData As Object, ByVal context _
       As ExpressionBuilderContext) As CodeExpression
        Dim type1 As Type = entry.DeclaringType
        Dim descriptor1 As PropertyDescriptor = _
           TypeDescriptor.GetProperties(type1)(entry.PropertyInfo.Name)
        Dim expressionArray1(2) As CodeExpression
        expressionArray1(0) = New CodePrimitiveExpression(entry.Expression.Trim())
        expressionArray1(1) = New CodeTypeOfExpression(type1)
        expressionArray1(2) = New CodePrimitiveExpression(entry.Name)
        Return New CodeCastExpression(descriptor1.PropertyType, _
           New CodeMethodInvokeExpression(New CodeTypeReferenceExpression _
           (MyBase.GetType()), "GetEvalData", expressionArray1))
    End Function

    Public Overrides ReadOnly Property SupportsEvaluate() As Boolean
        Get
            Return True
        End Get
    End Property
End Class

Комментарии

Класс ExpressionBuilder является базовым классом для построителей выражений, таких как AppSettingsExpressionBuilder класс, который создает выражения кода во время синтаксического анализа страниц.

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

Когда средство синтаксического анализа страницы обнаруживает выражение, разделенное строкой <%$ %>, оно создает построитель выражений для выражения на основе префикса в строке. Префикс — это часть строки, которая находится слева от двоеточия (:). Например, при обнаружении строки <%$ ConnectionStrings:MessageDB %>средство синтаксического анализа создает ConnectionStringsExpressionBuilder объект. Префиксы связаны с построителями выражений в файле Web.config в ExpressionBuilders разделе.

Справа от декларативного выражения передается построителю выражений для оценки. Переопределите GetCodeExpression метод для создания кода, который будет скомпилирован с помощью страницы.

Если вы хотите, чтобы построитель пользовательских выражений был активным на страницах, которые не компилируются, необходимо также переопределить EvaluateExpression метод для возврата объекта, представляющего результаты выражения. Также необходимо переопределить SupportsEvaluate свойство, чтобы указать, что построитель пользовательских выражений поддерживает страницы без компиляции.

Можно определить набор свойств и методов для выбора и оценки выражения, связанного со свойством элемента управления во время разработки, путем реализации редактора выражений. Редактор помечается в построителе выражений с помощью метаданных уровня класса. Дополнительные сведения см. в разделе ExpressionEditor.

Примечания для тех, кто реализует этот метод

При наследовании от ExpressionBuilder класса необходимо переопределить GetCodeExpression(BoundPropertyEntry, Object, ExpressionBuilderContext) метод.

Конструкторы

Имя Описание
ExpressionBuilder()

Инициализирует новый экземпляр класса ExpressionBuilder.

Свойства

Имя Описание
SupportsEvaluate

При переопределении в производном классе возвращает значение, указывающее, поддерживает ли текущий ExpressionBuilder объект страницы без компиляции.

Методы

Имя Описание
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
EvaluateExpression(Object, BoundPropertyEntry, Object, ExpressionBuilderContext)

При переопределении в производном классе возвращает объект, представляющий вычисляемое выражение.

GetCodeExpression(BoundPropertyEntry, Object, ExpressionBuilderContext)

При переопределении в производном классе возвращает код, используемый во время выполнения страницы для получения вычисляемого выражения.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
ParseExpression(String, Type, ExpressionBuilderContext)

При переопределении в производном классе возвращает объект, представляющий проанализированное выражение.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

См. также раздел