C# 检查操作是否为异步lambda

C# 检查操作是否为异步lambda,c#,async-await,C#,Async Await,因为我可以把一个动作定义为 Action a = async () => { }; 我是否可以(在运行时)以某种方式确定操作a是否异步?否-至少不明智async只是一个源代码注释,用于告诉C#编译器您确实需要一个异步函数/匿名函数 您可以获取代理的MethodInfo,并检查它是否应用了适当的属性。但我个人不这么认为——需要知道的是设计的味道。特别是,考虑如果将大部分代码从lambda表达式重构成另一种方法,那么使用:会发生什么? Action a = () => CallMeth

因为我可以把一个动作定义为

Action a = async () => { };

我是否可以(在运行时)以某种方式确定操作a是否异步?

否-至少不明智
async
只是一个源代码注释,用于告诉C#编译器您确实需要一个异步函数/匿名函数

您可以获取代理的
MethodInfo
,并检查它是否应用了适当的属性。但我个人不这么认为——需要知道的是设计的味道。特别是,考虑如果将大部分代码从lambda表达式重构成另一种方法,那么使用:

会发生什么?
Action a = () => CallMethodAsync();
此时您没有异步lambda,但语义是相同的。为什么您希望任何使用委托的代码都有不同的行为

编辑:此代码似乎有效,但我强烈建议您不要使用:


当然,你可以做到

private static bool IsAsyncAppliedToDelegate(Delegate d)
{
    return d.Method.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null;
}

当它是一个框架的输入时,@musefan@dllI-see。谢谢你的回答!我的好奇心越来越强。你为什么强烈反对它?@DavidBožjak:我的好奇心越来越强了。为什么要使用此代码?@Brian我正在编写一个将操作作为输入的框架,但不支持异步操作。这是有文档记录的,但通过这种方式,如果用户无论如何都传递了异步操作,我就会抛出一个异常。
private static bool IsAsyncAppliedToDelegate(Delegate d)
{
    return d.Method.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null;
}