How can I tell if a C# method is async/await via reflection?

asynchronous, c#, reflection

Solution

In my copy of your code, the `MethodInfo` for the `async` method contains the following items in the `CustomAttributes` property:

- a `DebuggerStepThroughAttribute`

- a `AsyncStateMachineAttribute`

whereas the `MethodInfo` for the normal method contains no items in its `CustomAttributes` property.

It seems like the `AsyncStateMachineAttribute` should reliably be found on an `async` method and not on a standard one.

Edit: In fact, that page even has the following in the examples!

As the following example shows, you can determine whether a method is marked with Async (Visual Basic) or async (C# Reference) modifier. In the example, IsAsyncMethod performs the following steps:

Obtains a MethodInfo object for the method name by using Type.GetMethod.

Obtains a Type object for the attribute by using GetType Operator (Visual Basic) or typeof (C# Reference).

Obtains an attribute object for the method and attribute type by using MethodInfo.GetCustomAttribute. If GetCustomAttribute returns Nothing (Visual Basic) or null (C#), the method doesn't contain the attribute.

private static bool IsAsyncMethod(Type classType, string methodName)
{
    // Obtain the method with the specified name.
    MethodInfo method = classType.GetMethod(methodName);

    Type attType = typeof(AsyncStateMachineAttribute);

    // Obtain the custom attribute for the method. 
    // The value returned contains the StateMachineType property. 
    // Null is returned if the attribute isn't present for the method. 
    var attrib = (AsyncStateMachineAttribute)method.GetCustomAttribute(attType);

    return (attrib != null);
}

Problem

e.g. ``` class Foo { public async Task Bar() { await Task.Delay(500); } } ``` If we are reflecting over this class and method, how can I determine if this is an actual async/await method rather than simply a method that happens to return a Task? ``` class Foo { public Task Bar() { return Task.Delay(500); } } ```

Original source

Related problems