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)

适用于

另请参阅