Scrittura del codice di un enumeratore Foreach personalizzatoCoding a Custom Foreach Enumerator

Dopo avere creato una classe che eredita dalla classe di base ForEachEnumerator e avere applicato l'attributo DtsForEachEnumeratorAttribute alla classe, è necessario eseguire l'override dell'implementazione delle proprietà e dei metodi della classe di base per fornire la funzionalità personalizzata.After you have created a class that inherits from the ForEachEnumerator base class, and applied the DtsForEachEnumeratorAttribute attribute to the class, you must override the implementation of the properties and methods of the base class to provide your custom functionality.

Per un esempio reale di enumeratore personalizzato, vedere lo sviluppo di un'interfaccia utente per un enumeratore ForEach personalizzato.For a working sample of a custom enumerator, see Developing a User Interface for a Custom ForEach Enumerator.

Inizializzazione dell'enumeratoreInitializing the Enumerator

È possibile eseguire l'override del metodo InitializeForEachEnumerator per memorizzare nella cache i riferimenti alle gestioni connessioni definite nel pacchetto e i riferimenti all'interfaccia degli eventi che è possibile utilizzare per generare errori, avvisi e messaggi informativi.You can override the InitializeForEachEnumerator method to cache references to the connection managers defined in the package, and to cache references to the events interface that you can use to raise errors, warnings, and informational messages.

Convalida dell'enumeratoreValidating the Enumerator

Eseguire l'override del metodo Validate per verificare che l'enumeratore sia configurato correttamente.You override the Validate method to verify that the enumerator is correctly configured. Se il metodo restituisce errore, l'enumeratore e il pacchetto che contiene l'enumeratore non verranno eseguiti.If the method returns Failure, the enumerator and the package that contains the enumerator will not be executed. L'implementazione di questo metodo è specifica di ogni enumeratore, ma se l'enumeratore si basa su oggetti Variable o ConnectionManager, è necessario aggiungere codice per verificare che questi oggetti esistano nelle raccolte fornite al metodo.The implementation of this method is specific to each enumerator, but if the enumerator relies on Variable or ConnectionManager objects, you should add code to verify that these objects exist in the collections that are provided to the method.

Nell'esempio di codice seguente è illustrata un'implementazione di Validate che verifica una variabile specificata in una proprietà dell'enumeratore.The following code example demonstrates an implementation of Validate that checks for a variable specified in a property of the enumerator.

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  

Restituzione della raccoltaReturning the Collection

Durante l'esecuzione il contenitore ForEachLoop chiama il metodo GetEnumerator dell'enumeratore personalizzato.During execution, the ForEachLoop container calls the GetEnumerator method of the custom enumerator. In questo metodo l'enumeratore crea e popola la raccolta di elementi, quindi la restituisce.In this method, the enumerator creates and populates its collection of items, and then returns the collection. ForEachLoop scorre quindi gli elementi della raccolta ed esegue il flusso di controllo per ognuno di essi.The ForEachLoop then iterates the items in the collection, and executes its control flow for each item in the collection.

Nell'esempio seguente è illustrata un'implementazione di GetEnumerator che restituisce una matrice di numeri interi casuali.The following example shows an implementation of GetEnumerator that returns an array of random integers.

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  

Vedere ancheSee Also

Creazione di un enumeratore Foreach personalizzato Creating a Custom Foreach Enumerator
Sviluppo di un'interfaccia utente per un enumeratore ForEach personalizzatoDeveloping a User Interface for a Custom ForEach Enumerator