IteratorStateMachineAttribute Класс

Определение

Указывает, помечен ли метод в Visual Basic модификатором Iterator.Indicates whether a method in Visual Basic is marked with the Iterator modifier.

public ref class IteratorStateMachineAttribute sealed : System::Runtime::CompilerServices::StateMachineAttribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
[System.Serializable]
public sealed class IteratorStateMachineAttribute : System.Runtime.CompilerServices.StateMachineAttribute
type IteratorStateMachineAttribute = class
    inherit StateMachineAttribute
Public NotInheritable Class IteratorStateMachineAttribute
Inherits StateMachineAttribute
Наследование
IteratorStateMachineAttribute
Атрибуты

Примеры

В следующем примере показано, как определить, является ли метод методом итератора.The following example shows how to determine whether a method is an iterator method. В этом примере IsIteratorMethod выполняет следующие действия.In the example, IsIteratorMethod performs the following steps:

  • Получает объект для имени метода с помощью Type.GetMethod. MethodInfoObtains a MethodInfo object for the method name by using Type.GetMethod.

  • Получает объект для атрибута с помощью оператора GetType. TypeObtains a Type object for the attribute by using GetType Operator.

  • Получает объект атрибута для метода и типа атрибута с помощью MethodInfo.GetCustomAttribute.Obtains an attribute object for the method and attribute type by using MethodInfo.GetCustomAttribute. Если GetCustomAttribute возвращаетNothing (Visual Basic), метод не содержит атрибут.If GetCustomAttribute returns Nothing (Visual Basic), the method doesn't contain the attribute.

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

Комментарии

IteratorStateMachine Атрибут не следует применять к методам в коде.You shouldn't apply the IteratorStateMachine attribute to methods in your code. Для методов в Visual Basic, имеющих модификатор iterator , компилятор применяет IteratorStateMachine атрибут в IL, который он создает.For methods in Visual Basic that have the Iterator modifier, the compiler will apply the IteratorStateMachine attribute in the IL that it emits.

Если метод (MethodName) в Visual Basic имеет Iterator модификатор, компилятор выдает IL, включающий структуру конечного автомата.When a method (MethodName) in Visual Basic has the Iterator modifier, the compiler emits IL that includes a state machine structure. Эта структура содержит код в методе.That structure contains the code in the method. Этот IL также содержит метод-заглушку (имя_метода), который вызывает конечный автомат.That IL also contains a stub method (MethodName) that calls into the state machine. Компилятор добавляет IteratorStateMachine атрибут к методу-заглушке, чтобы средства могли обнаруживать соответствующий конечный автомат.The compiler adds the IteratorStateMachine attribute to the stub method so that tools can identify the corresponding state machine. Сведения о выпущенном IL могут измениться в будущих выпусках компиляторов.Details of the emitted IL might change in future releases of the compilers.

Метод итератора выполняет настраиваемую итерацию по коллекции, используя Yield инструкцию (Visual Basic) для возвращения каждого элемента по одному за раз.An iterator method performs a custom iteration over a collection by using the Yield (Visual Basic) statement to return each element one at a time. Дополнительные сведения см. в разделе Итераторы.For more information, see Iterators.

Примечание

Нельзя использовать IteratorStateMachineAttribute для проверки того, является ли метод методом итератора в C#.You can't use IteratorStateMachineAttribute to test whether a method is an iterator method in C#.

Конструкторы

IteratorStateMachineAttribute(Type)

Инициализирует новый экземпляр класса IteratorStateMachineAttribute.Initializes a new instance of the IteratorStateMachineAttribute class.

Свойства

StateMachineType

Возвращает объект типа для типа базового конечного автомата, который был создан компилятором для реализации метода конечного автомата.Returns the type object for the underlying state machine type that was generated by the compiler to implement the state machine method.

(Унаследовано от StateMachineAttribute)
TypeId

При реализации в производном классе возвращает уникальный идентификатор для этого Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Унаследовано от Attribute)

Методы

Equals(Object)

Возвращает значение, показывающее, равен ли экземпляр указанному объекту.Returns a value that indicates whether this instance is equal to a specified object.

(Унаследовано от Attribute)
GetHashCode()

Возвращает хэш-код данного экземпляра.Returns the hash code for this instance.

(Унаследовано от Attribute)
GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Унаследовано от Object)
IsDefaultAttribute()

При переопределении в производном классе указывает, является ли значение этого экземпляра значением по умолчанию для производного класса.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Унаследовано от Attribute)
Match(Object)

При переопределении в производном классе возвращает значение, указывающее, является ли этот экземпляр равным заданному объекту.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Унаследовано от Attribute)
MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Унаследовано от Object)

Явные реализации интерфейса

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

Сопоставляет набор имен соответствующему набору идентификаторов диспетчеризации.Maps a set of names to a corresponding set of dispatch identifiers.

(Унаследовано от Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Возвращает сведения о типе объекта, которые можно использовать для получения сведений о типе интерфейса.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Унаследовано от Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Возвращает количество предоставляемых объектом интерфейсов для доступа к сведениям о типе (0 или 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Унаследовано от Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Предоставляет доступ к открытым свойствам и методам объекта.Provides access to properties and methods exposed by an object.

(Унаследовано от Attribute)

Применяется к

Дополнительно