Freigeben über


IteratorStateMachineAttribute Klasse

Definition

Gibt an, ob eine Methode in Visual Basic mit dem Iterator Modifizierer markiert ist.

public ref class IteratorStateMachineAttribute sealed : System::Runtime::CompilerServices::StateMachineAttribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
public sealed class IteratorStateMachineAttribute : System.Runtime.CompilerServices.StateMachineAttribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
[System.Serializable]
public sealed class IteratorStateMachineAttribute : System.Runtime.CompilerServices.StateMachineAttribute
[<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)>]
type IteratorStateMachineAttribute = class
    inherit StateMachineAttribute
[<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)>]
[<System.Serializable>]
type IteratorStateMachineAttribute = class
    inherit StateMachineAttribute
Public NotInheritable Class IteratorStateMachineAttribute
Inherits StateMachineAttribute
Vererbung
IteratorStateMachineAttribute
Attribute

Beispiele

Das folgende Beispiel zeigt, wie Sie bestimmen, ob es sich bei einer Methode um eine Iteratormethode handelt. Führen Sie im Beispiel IsIteratorMethod die folgenden Schritte aus:

  • Ruft ein MethodInfo Objekt für den Methodennamen mithilfe Type.GetMethodvon .

  • Ruft ein Type Objekt für das Attribut mithilfe des GetType-Operators ab.

  • Ruft ein Attributobjekt für die Methode und den Attributtyp mithilfe von MethodInfo.GetCustomAttribute. Wenn GetCustomAttribute die Methode (Visual Basic) zurückgegeben wird Nothing , enthält die Methode nicht das Attribut.

Imports System.Collections.Generic
Imports System.Reflection
Imports System.Threading.Tasks
Imports System.Runtime.CompilerServices


Module Module1

    ' This class is used by the code below to discover method attributes.
    Public Class TheClass
        Public Async Function AsyncMethod() As Task(Of Integer)
            Await Task.Delay(5)
            Return 1
        End Function

        Public Iterator Function IteratorMethod() As IEnumerable(Of Integer)
            Yield 1
            Yield 2
        End Function

        Public Function RegularMethod() As Integer
            Return 0
        End Function
    End Class


    Private Function IsAsyncMethod(classType As Type, methodName As String)
        ' Obtain the method with the specified name.
        Dim method As MethodInfo = classType.GetMethod(methodName)

        Dim attType As Type = GetType(AsyncStateMachineAttribute)

        Dim attrib = CType(method.GetCustomAttribute(attType), AsyncStateMachineAttribute)
        ' The above variable contains the StateMachineType property.

        Return (attrib IsNot Nothing)
    End Function

    Private Function IsIteratorMethod(classType As Type, methodName As String)
        ' Obtain the method with the specified name.
        Dim method As MethodInfo = classType.GetMethod(methodName)

        Dim attType As Type = GetType(IteratorStateMachineAttribute)

        ' Obtain the custom attribute for the method.
        ' The value returned contains the StateMachineType property.
        ' Nothing is returned if the attribute isn't present for the method.
        Dim attrib = CType(method.GetCustomAttribute(attType), IteratorStateMachineAttribute)

        Return (attrib IsNot Nothing)
    End Function

    Private Sub ShowResult(classType As Type, methodName As String)
        Console.Write((methodName & ": ").PadRight(16))

        If IsAsyncMethod(classType, methodName) Then
            Console.WriteLine("Async method")
        ElseIf IsIteratorMethod(classType, methodName) Then
            Console.WriteLine("Iterator method")
        Else
            Console.WriteLine("Regular method")
        End If

        ' Note: The IteratorStateMachineAttribute applies to Visual Basic methods
        ' but not C# methods.
    End Sub

    Sub Main()
        ShowResult(GetType(TheClass), "AsyncMethod")
        ShowResult(GetType(TheClass), "IteratorMethod")
        ShowResult(GetType(TheClass), "RegularMethod")

        Console.ReadKey()
    End Sub

    '   AsyncMethod:    Async method
    '   IteratorMethod: Iterator method
    '   RegularMethod:  Regular method

End Module

Hinweise

Sie sollten das IteratorStateMachine Attribut nicht auf Methoden in Ihrem Code anwenden. Bei Methoden in Visual Basic mit dem Iterator-Modifizierer wendet der Compiler das IteratorStateMachine Attribut in der von ihr ausgegebenen IL an.

Wenn eine Methode (MethodName) in Visual Basic über den Iterator Modifizierer verfügt, gibt der Compiler IL aus, die eine Zustandsautomatenstruktur enthält. Diese Struktur enthält den Code in der Methode. Diese IL enthält auch eine Stubmethode (MethodName), die den Zustandsautomaten aufruft. Der Compiler fügt das IteratorStateMachine Attribut der Stubmethode hinzu, sodass Tools den entsprechenden Zustandsautomaten identifizieren können. Details der ausgegebenen IL können sich in zukünftigen Versionen der Compiler ändern.

Eine Iteratormethode führt eine benutzerdefinierte Iteration über eine Auflistung mithilfe der Yield (Visual Basic)-Anweisung aus, um jedes Element einzeln zurückzugeben.

Note

Sie können nicht verwenden IteratorStateMachineAttribute , um zu testen, ob es sich bei einer Methode um eine Iteratormethode in C# handelt.

Konstruktoren

Name Beschreibung
IteratorStateMachineAttribute(Type)

Initialisiert eine neue Instanz der IteratorStateMachineAttribute-Klasse.

Eigenschaften

Name Beschreibung
StateMachineType

Gibt das Typobjekt für den zugrunde liegenden Zustandsautomatentyp zurück, der vom Compiler generiert wurde, um die Zustandsautomatmethode zu implementieren.

(Geerbt von StateMachineAttribute)
TypeId

Wenn sie in einer abgeleiteten Klasse implementiert wird, wird ein eindeutiger Bezeichner für diese Attribute.

(Geerbt von Attribute)

Methoden

Name Beschreibung
Equals(Object)

Gibt einen Wert zurück, der angibt, ob diese Instanz einem angegebenen Objekt entspricht.

(Geerbt von Attribute)
GetHashCode()

Gibt den Hashcode für diese Instanz zurück.

(Geerbt von Attribute)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
IsDefaultAttribute()

Wenn sie in einer abgeleiteten Klasse überschrieben wird, gibt an, ob der Wert dieser Instanz der Standardwert für die abgeleitete Klasse ist.

(Geerbt von Attribute)
Match(Object)

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem angegebenen Objekt entspricht.

(Geerbt von Attribute)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Explizite Schnittstellenimplementierungen

Name Beschreibung
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Ordnet eine Reihe von Namen einer entsprechenden Reihe von Dispatchbezeichnern zu.

(Geerbt von Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Ruft die Typinformationen für ein Objekt ab, mit denen die Typinformationen für eine Schnittstelle abgerufen werden können.

(Geerbt von Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Ruft die Anzahl der Schnittstellen mit Typinformationen ab, die von einem Objekt bereitgestellt werden (0 oder 1).

(Geerbt von Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Bietet Zugriff auf Eigenschaften und Methoden, die von einem Objekt verfügbar gemacht werden.

(Geerbt von Attribute)

Gilt für:

Weitere Informationen