共用方式為


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) 方法。

建構函式

名稱 Description
ExpressionBuilder()

初始化 ExpressionBuilder 類別的新執行個體。

屬性

名稱 Description
SupportsEvaluate

當在派生類別中覆寫時,會回傳一個值,表示目前 ExpressionBuilder 物件是否支援不可編譯頁面。

方法

名稱 Description
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)

適用於

另請參閱