Freigeben über


IteratorStateMachineAttribute Klasse

Definition

Gibt an, ob eine Methode in Visual Basic mit dem Iterator 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 ermitteln, ob eine Methode eine Iteratormethode ist. Führen Sie im Beispiel IsIteratorMethod die folgenden Schritte aus:

  • Ruft mithilfe von Type.GetMethodein MethodInfo -Objekt für den Methodennamen ab.

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

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

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, die über den Iteratormodifizierer verfügen, wendet der Compiler das Attribut in der IteratorStateMachine il-Datei an, die er ausgibt.

Wenn eine Methode (MethodName) in Visual Basic über den Iterator Modifizierer verfügt, gibt der Compiler IL aus, die eine Zustandscomputerstruktur enthält. Diese Struktur enthält den Code in der -Methode. Diese IL enthält auch eine Stubmethode (MethodName), die den Zustandscomputer aufruft. Der Compiler fügt das IteratorStateMachine Attribut der Stubmethode hinzu, damit Tools den entsprechenden Zustandscomputer 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 aus, indem sie die Yield (Visual Basic)-Anweisung verwendet, um jedes Element einzeln zurückzugeben. Weitere Informationen finden Sie unter Iteratoren.

Hinweis

Sie können nicht verwenden IteratorStateMachineAttribute , um zu testen, ob eine Methode eine Iteratormethode in C# ist.

Konstruktoren

IteratorStateMachineAttribute(Type)

Initialisiert eine neue Instanz der IteratorStateMachineAttribute-Klasse.

Eigenschaften

StateMachineType

Gibt das Typobjekt für den zugrunde liegenden Zustandsautomaten zurück, der vom Compiler generiert wurde, um die Zustandsautomat-Methode zu implementieren.

(Geerbt von StateMachineAttribute)
TypeId

Ruft bei Implementierung in einer abgeleiteten Klasse einen eindeutigen Bezeichner für dieses Attribute ab.

(Geerbt von Attribute)

Methoden

Equals(Object)

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

(Geerbt von Attribute)
GetHashCode()

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

(Geerbt von Attribute)
GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
IsDefaultAttribute()

Gibt beim Überschreiben in einer abgeleiteten Klasse an, ob der Wert der Instanz der Standardwert für die abgeleitete Klasse ist.

(Geerbt von Attribute)
Match(Object)

Beim Überschreiben in einer abgeleiteten Klasse wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem bestimmten Objekt entspricht.

(Geerbt von Attribute)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

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

(Geerbt von Object)

Explizite Schnittstellenimplementierungen

_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 deren Hilfe 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)

Stellt den Zugriff auf von einem Objekt verfügbar gemachte Eigenschaften und Methoden bereit.

(Geerbt von Attribute)

Gilt für:

Weitere Informationen