사용자 지정 Foreach 열거자 코딩Coding a Custom Foreach Enumerator

ForEachEnumerator 기본 클래스에서 상속된 클래스를 만들고 이 클래스에 DtsForEachEnumeratorAttribute 특성을 적용한 후에는 기본 클래스의 속성 및 메서드 구현을 재정의하여 사용자 지정 기능을 제공해야 합니다.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.

사용자 지정 열거자의 작업 예제를 참조 하십시오. 사용자 인터페이스 사용자 지정 ForEach 열거자에 대 한 개발합니다.For a working sample of a custom enumerator, see Developing a User Interface for a Custom ForEach Enumerator.

열거자 초기화Initializing the Enumerator

InitializeForEachEnumerator 메서드를 재정의하여 패키지에 정의된 연결 관리자에 대한 참조를 캐시하고 오류, 경고 및 정보 메시지를 발생시키는 데 사용할 수 있는 이벤트 인터페이스에 대한 참조를 캐시할 수 있습니다.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.

열거자 유효성 검사Validating the Enumerator

Validate 메서드를 재정의하여 열거자가 올바르게 구성되어 있는지 확인할 수 있습니다.You override the Validate method to verify that the enumerator is correctly configured. 메서드에서 반환 되 면 오류, 열거자 및 열거자를 포함 하는 패키지 실행 되지 것입니다.If the method returns Failure, the enumerator and the package that contains the enumerator will not be executed. 이 메서드의 구현은 각 열거자에 고유하지만 열거자가 Variable 또는 ConnectionManager 개체에 의존하는 경우 코드를 추가하여 메서드에 제공된 컬렉션에 이러한 개체가 있는지 확인해야 합니다.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.

다음 코드 예에서는 열거자의 속성에 지정된 변수를 확인하는 Validate의 구현을 보여 줍니다.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  

컬렉션 반환Returning the Collection

실행 중 ForEachLoop 컨테이너는 사용자 지정 열거자의 GetEnumerator 메서드를 호출합니다.During execution, the ForEachLoop container calls the GetEnumerator method of the custom enumerator. 이 메서드에서 열거자는 항목 컬렉션을 만들어 채운 다음 반환합니다.In this method, the enumerator creates and populates its collection of items, and then returns the collection. 그런 다음 ForEachLoop는 컬렉션의 항목을 반복하고 컬렉션의 각 항목에 대한 제어 흐름을 실행합니다.The ForEachLoop then iterates the items in the collection, and executes its control flow for each item in the collection.

다음 예에서는 난수의 배열을 반환하는 GetEnumerator의 구현을 보여 줍니다.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  

참고 항목See Also

사용자 지정 Foreach 열거자 만들기 Creating a Custom Foreach Enumerator
사용자 지정 ForEach 열거자에 대 한 사용자 인터페이스 개발Developing a User Interface for a Custom ForEach Enumerator