使用ExpressionBuilder 类 在分析页的过程中计算表达式

ExpressionBuilder 类是在分析页的过程中创建代码表达式的表达式生成器的基类

表达式生成器分析声明性表达式,并创建代码来检索绑定到控件属性的值。在非编译方案中,支持非编译功能的表达式生成器在运行时计算表达式。

页分析器如果遇到用 <%$ %> 字符串分隔的表达式,则根据字符串中的前缀为表达式创建表达式生成器。前缀是字符串中冒号 (:) 左侧的部分。例如,分析器如果遇到字符串 <%$ ConnectionStrings:MessageDB %>,则创建一个 ConnectionStringsExpressionBuilder 对象。前缀与 Web.config 文件的 ExpressionBuilders 节中的表达式生成器相关联。

声明性表达式的右侧被传递给表达式生成器进行计算。重写 GetCodeExpression 方法可生成与页一起编译的代码。

如果希望自定义表达式生成器在不编译的页上是活动的,还必须重写 EvaluateExpression 方法以返回表示表达式结果的对象。此外,还必须重写 SupportsEvaluate 属性,以指示自定义表达式生成器不支持非编译页。

可以定义一组属性和方法,用于选择和计算在设计时使用表达式编辑器与控件属性进行关联的表达式。编辑器通过类级别的元数据在表达式生成器上进行标记。

继承者说明:

ExpressionBuilder 类继承时,必须重写 GetCodeExpression 方法。

 

下面示例说明:如何通过实现 ExpressionBuilder 抽象类来构建自定义表达式生成器。

第一步:首先在 Web.config 文件中注册自定义表达式生成器。

<configuration>
    <system.web>
       <compilation>
          <expressionBuilders>
              <add expressionPrefix="MyCustomExpression"    type="MyExpressionBuilder"/>
          </expressionBuilders>
       </compilation>
    </system.web>
</configuration>
第二步:编写后台计算表达式的类,该类必须放在 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
{
    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; }
    }
}
第三步:引用计算表达式 。
<asp:Label ID="Label1" runat="server" Text="<%$ MyCustomExpression:Hello, world! %>" />
上一篇:理解Node.js的事件循环


下一篇:封装数据库操作