C# 8新提案让泛型Attribute成为现实

\u003cp\u003e从一开始, Attribute就是.NET的一部分。因此,它们在引入泛型之前就已经被创建好,这意味着如果要引用属性中的类型,必须暴露一个Type参数或属性。例如:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[TypeConverter(typeof(X))]\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e这种模式存在一些限制。在上面的示例中,X必须有一个无参数的构造函数,并继承TypeConverter。编译器不会强制这些,所以开发人员只能在运行时发现错误。\u003c/p\u003e\n\u003cp\u003e相反,如果我们使用泛型类型参数,那么就可以在编译器强制执行这些规则,而且语法会稍微清晰一些。\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[TypeConverter\u0026lt;X\u0026gt;]\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e理论上,“\u003ca href=\"https://github.com/dotnet/csharplang/issues/124\"\u003eAllow Generic Attributes\u003c/a\u003e”提案是一个非常简单的变更。CLR已经支持这个概念,问题是如何在.NET语言中使用它。但有时候理论和现实是两条平行线,而且即使CLR可以支持,并不代表就一定会支持。Jan Kotas解释说:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我认为这个问题的本质与局部引用和return类似。局部引用和return不受任何API的限制,理论上它们在现有的运行时、工具和库上都能正常运行。但在实际当中,它们可能不能正常运行,因为它们暴露了预先存在的错误和限制,可能是因为它们的处理路径从未被执行过,或者它们明显不在预期之内。与引用return相关的错误和问题刚刚开始出现,因为人们开始使用这项功能,并发现了一些不奏效的地方。我认为这在预期之内。我们应该承认这些事实,并且不会采取之前我们撤回默认值类型构造函数功能那样的行动。\u003c/p\u003e\n\u003cp\u003e这个功能非常类似。ECMA并没有针对禁止使用泛型Attribute的内容,在理论上应该可以正常运行,但实际上却没有。如果要正常运行,必须更新整个系统中的很多部件:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e存在多个运行时(Mono、CoreRT、整个框架);\u003c/li\u003e\n\u003cli\u003eIL的一些工具也可能会受到影响(编译器、基于Cecil或基于CCI2的工具);\u003c/li\u003e\n\u003cli\u003e可能需要用于访问泛型Attribute的API(例如,现有的反射API不允许你访问泛型Attribute——你必须进行枚举)。\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e该提案的一个限制是在编译时必须“关闭”Attribute功能。下面是提案中提供的一个启用泛型Attribute的例子。\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e[SomeAttribute\u0026lt;T\u0026gt;]\npublic void DoSomething\u0026lt;T\u0026gt;(T input) { }\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e因为T不是在编译时定义的,因此反射机制就不知道这个表达式会返回什么。\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003etypeof(GenericClass\u0026lt;\u0026gt;).GetMethod(\u0026quot;DoSomething\u0026quot;).GetCustomAttributes()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003e状态\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e目前,泛型Attribute功能列在\u003ca href=\"https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md\"\u003eC# 8路线图\u003c/a\u003e中,状态为“进行中”。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e查看英文原文\u003c/strong\u003e:\u003ca href=\"https://www.infoq.com/news/2019/01/Generic-Attributes\"\u003ehttps://www.infoq.com/news/2019/01/Generic-Attributes\u003c/a\u003e\u003c/p\u003e\n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值