2013-09-26 46 views
7

因为我可以定义一个动作作为检查行动是异步拉姆达

Action a = async() => { }; 

我可以以某种方式确定(在运行时)的动作是否是异步或不?

+0

这是什么情况,你不知道它是否? – musefan

+3

@musefan当它是一个输入框架的DLL –

回答

13

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

可以MethodInfo为代表,并检查其是否已应用适当的属性。我个人不会 - 需要知道的是一种设计气味。特别是考虑,如果你重构大部分代码出来的lambda表达式的会发生什么事成另一种方法,则使用:

Action a =() => CallMethodAsync(); 

在这一点上,你有一个异步的λ,但语义会是一样的。为什么你会希望使用委托的代码具有不同的行为?

编辑:此代码似乎工作,但我会强烈反对它

using System; 
using System.Runtime.CompilerServices; 

class Test 
{ 
    static void Main()   
    { 
     Console.WriteLine(IsThisAsync(() => {}));  // False 
     Console.WriteLine(IsThisAsync(async() => {})); // True 
    } 

    static bool IsThisAsync(Action action) 
    { 
     return action.Method.IsDefined(typeof(AsyncStateMachineAttribute), 
             false); 
    } 
} 
+0

我明白了。感谢你的回答! –

+2

我的好奇心越来越好。你为什么强烈建议反对它? –

+0

@DavidBožjak:我的好奇心越来越好。你为什么要使用这段代码? – Brian

3

当然,你可以做到这一点。

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