ExpressionBuilder 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
在頁面解析過程中評估表達式。
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) |