撰寫自訂 Foreach 列舉值的程式碼
建立繼承自 ForEachEnumerator 基底類別的類別,並將 DtsForEachEnumeratorAttribute 屬性 (attribute) 套用到類別之後,必須覆寫基底類別的屬性 (properties) 與方法的實作,才可提供自訂功能。
如需自訂列舉值的工作範例,請參閱<開發自訂 ForEach 列舉值的使用者介面>。
初始化列舉值
您可以覆寫 InitializeForEachEnumerator 方法,以快取定義在封裝中的連接管理員參考,並快取可用以引發錯誤、警告和參考用訊息的事件介面參考。
驗證列舉值
您覆寫 Validate 方法,以驗證已正確設定的列舉值。 如果該方法傳回 Failure,將不會執行列舉值和含有列舉值的封裝。 這個方法的實作會隨每個列舉值而有所不同,但是如果列舉值依賴 Variable 或 ConnectionManager 物件,就應該加入程式碼以確認提供給該方法之集合中有這些物件。
下列程式碼範例將示範 Validate 的實作,以檢查列舉值屬性中所指定的變數。
private string variableNameValue;
public string VariableName
{
get{ return this.variableNameValue; }
set{ this.variableNameValue = value; }
}
public override DTSExecResult Validate(Connections connections, VariableDispenser variableDispenser, IDTSInfoEvents infoEvents, IDTSLogging log)
{
if (!variableDispenser.Contains(this.variableNameValue))
{
infoEvents.FireError(0, "MyEnumerator", "The Variable " + this.variableNameValue + " does not exist in the collection.", "", 0);
return DTSExecResult.Failure;
}
return DTSExecResult.Success;
}
Private variableNameValue As String
Public Property VariableName() As String
Get
Return Me.variableNameValue
End Get
Set (ByVal Value As String)
Me.variableNameValue = value
End Set
End Property
Public Overrides Function Validate(ByVal connections As Connections, ByVal variableDispenser As VariableDispenser, ByVal infoEvents As IDTSInfoEvents, ByVal log As IDTSLogging) As DTSExecResult
If Not variableDispenser.Contains(Me.variableNameValue) Then
infoEvents.FireError(0, "MyEnumerator", "The Variable " + Me.variableNameValue + " does not exist in the collection.", "", 0)
Return DTSExecResult.Failure
End If
Return DTSExecResult.Success
End Function
傳回集合
在執行期間,ForEachLoop 容器會呼叫自訂列舉值的 GetEnumerator 方法。 在此方法中,列舉值會建立和擴展其項目集合,然後傳回該集合。 ForEachLoop 接著會反覆運算集合中的項目,並為集合中的每個項目執行其控制流程。
下列程式碼範例顯示會傳回隨機整數陣列的 GetEnumerator 實作。
public override object GetEnumerator()
{
ArrayList numbers = new ArrayList();
Random randomNumber = new Random(DateTime.Now);
for( int x=0; x < 100; x++ )
numbers.Add( randomNumber.Next());
return numbers;
}
Public Overrides Function GetEnumerator() As Object
Dim numbers As ArrayList = New ArrayList()
Dim randomNumber As Random = New Random(DateTime.Now)
Dim x As Integer
For x = 0 To 100- 1 Step x + 1
numbers.Add(randomNumber.Next())
Next
Return numbers
End Function
|