如何在C#中为Lambda函数添加属性?

ANG*_*von 5 c# lambda custom-attributes

我在C#中有一个自定义属性:MyAttr.我有一个方法,希望委托作为参数.

我现在将lambda表达式传递给该方法:

SomeMethod((object o) => { DoSomething(); });
Run Code Online (Sandbox Code Playgroud)

DoSomething()方法使用relfection来获取有关调用方法的信息(在本例中为lambda表达式).但它无法找到所需的信息,因为lambda表达式没有属性:-(

我想要做的是以下之一:

// This does not work:
SomeMethod([MyAttr](object o) => { DoSomething(); });
// Thos does not work, too:
SomeMethod((object o) => [MyAttr] { DoSomething(); });
Run Code Online (Sandbox Code Playgroud)

是否有可能将属性放入lambda表达式?

And*_*lad 5

不幸的是,这还不可能。您将不得不使用“旧方法”,通过创建delegate具有该属性的方法。然而,正如xanatos指出的那样,这可能会出现在 C# 的下一版本中。

[MyAttr]
private void MyCallback(object o)
{
}
Run Code Online (Sandbox Code Playgroud)

实际上,这个问题在这里已经有了答案: Custom attribute on parameter of anonymous lambda

编辑(七年后)

从 C# 10 开始,这是可能的。

// This does work from C# 10:
var lambda = [MyAttr] (object o) => { DoSomething(); };
SomeMethod(lambda);
Run Code Online (Sandbox Code Playgroud)

  • 我要补充的是,C# 7.0 的功能请求的一部分正是这样的:https://github.com/dotnet/roslyn/issues/117 *我们应该考虑添加对在 lambda 上放置属性的支持* (3认同)
  • 看起来现在在 C# 10.0 中:https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10#lambda-expression-improvements (3认同)