4

为什么我们不能添加一个 lambda 作为属性参数?例如我想做:

[MyAttribut(Transform= {object => object.ToSomethingElse()})]

我应该明白 C# 中的 lambda 只是闭包吗?

编辑:通过查看所有答案,让我准确了解大多数人似乎不知道的一件事:Lambda 字面意思是编译时结构,除非它是一个闭包。

4

3 回答 3

4

属性的参数需要是编译时常量。

来自 MSDN -属性参数类型

传递给属性的值必须在编译时为编译器所知。

它们也仅限于以下类型:

  • 布尔
  • 字符,无符号字符
  • 短,无符号短
  • 整数,无符号整数
  • 长,无符号长
  • __int64,无符号 __int64
  • 浮动,双
  • wchar_t
  • char* 或 wchar_t* 或 System::String*
  • 系统::类型 ^
  • 系统::对象 ^
  • 枚举
于 2012-06-08T15:06:39.510 回答
4

属性参数仅限于以下类型的常量值:

  • 简单类型(bool、byte、char、short、int、long、float 和 double)

  • 细绳

  • 系统类型

  • 枚举

  • 对象(对象类型的属性参数的参数必须是上述类型之一的常量值。)

  • 上述任何类型的一维数组

http://msdn.microsoft.com/en-us/library/aa288454%28VS.71%29.aspx

于 2012-06-08T15:07:42.790 回答
0

尽管您不能直接执行此操作,但您可以在运行时更新您的属性。

请参阅我对Attribute Constructor With Lambda问题的回答。

有一个代码示例演示了这个想法。这是我用来从资源中获取显示名称而无需复制名称以进行属性初始化的方法。我仍然必须确保资源文件中的名称匹配。为了帮助确保它保持同步,您可以进行单元测试,或者您可以创建一个使用多个 lambda 进行映射的系统(一个用于属性,另一个用于资源)...

于 2014-10-01T15:56:37.083 回答