写点什么

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

  • 2019-01-28
  • 本文字数:955 字

    阅读完需:约 3 分钟

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

从一开始, Attribute 就是.NET 的一部分。因此,它们在引入泛型之前就已经被创建好,这意味着如果要引用属性中的类型,必须暴露一个 Type 参数或属性。例如:


[TypeConverter(typeof(X))]
复制代码


这种模式存在一些限制。在上面的示例中,X 必须有一个无参数的构造函数,并继承 TypeConverter。编译器不会强制这些,所以开发人员只能在运行时发现错误。


相反,如果我们使用泛型类型参数,那么就可以在编译器强制执行这些规则,而且语法会稍微清晰一些。


[TypeConverter<X>]
复制代码


理论上,“Allow Generic Attributes”提案是一个非常简单的变更。CLR 已经支持这个概念,问题是如何在.NET 语言中使用它。但有时候理论和现实是两条平行线,而且即使 CLR 可以支持,并不代表就一定会支持。Jan Kotas 解释说:


我认为这个问题的本质与局部引用和 return 类似。局部引用和 return 不受任何 API 的限制,理论上它们在现有的运行时、工具和库上都能正常运行。但在实际当中,它们可能不能正常运行,因为它们暴露了预先存在的错误和限制,可能是因为它们的处理路径从未被执行过,或者它们明显不在预期之内。与引用 return 相关的错误和问题刚刚开始出现,因为人们开始使用这项功能,并发现了一些不奏效的地方。我认为这在预期之内。我们应该承认这些事实,并且不会采取之前我们撤回默认值类型构造函数功能那样的行动。

这个功能非常类似。ECMA 并没有针对禁止使用泛型 Attribute 的内容,在理论上应该可以正常运行,但实际上却没有。如果要正常运行,必须更新整个系统中的很多部件:

  1. 存在多个运行时(Mono、CoreRT、整个框架);

  2. IL 的一些工具也可能会受到影响(编译器、基于 Cecil 或基于 CCI2 的工具);

  3. 可能需要用于访问泛型 Attribute 的 API(例如,现有的反射 API 不允许你访问泛型 Attribute——你必须进行枚举)。


该提案的一个限制是在编译时必须“关闭”Attribute 功能。下面是提案中提供的一个启用泛型 Attribute 的例子。


[SomeAttribute<T>]public void DoSomething<T>(T input) { }
复制代码


因为 T 不是在编译时定义的,因此反射机制就不知道这个表达式会返回什么。


typeof(GenericClass<>).GetMethod("DoSomething").GetCustomAttributes()
复制代码


状态


目前,泛型 Attribute 功能列在C# 8路线图中,状态为“进行中”。


查看英文原文https://www.infoq.com/news/2019/01/Generic-Attributes


2019-01-28 10:075316
用户头像

发布了 731 篇内容, 共 462.3 次阅读, 收获喜欢 2005 次。

关注

评论

发布
暂无评论
发现更多内容

搭载联想小天个人智能体的AI PC亮相 PC从此变CP

科技热闻

除了Pura70系列,华为最近还有这件事值得关注!

平平无奇爱好科技

智慧医院解决方案

菜根老谭

智慧医院

一文了解AI长文本工具:马斯克打脸OpenAI,全球最大巨无霸模型Grok-1开源!

蓉蓉

openai

Appium控件交互策略:优化自动化测试效率的关键方法

霍格沃兹测试开发学社

重回铁王座!时隔5年!Quill 2.0 终于发布啦🎉

Kagol

前端 富文本编辑器

企业为什么需要MES,万界星空科技MES系统的解决方案

万界星空科技

数字化转型 工业互联网 制造业 mes 万界星空科技

扣非净利同比大增1722.92%,歌尔股份发布2024年一季度财报

财见

后端的克星,前端的福音 -快捷提供数据库的REST数据访问接口

zhumingwu

联想用万全智算,画出中国AI的山脊

脑极体

AI

代码评审-findBugs

追随月光的战士

代码质量 githook findbugs

详解数仓的向量化执行引擎

华为云开发者联盟

数据库 华为云 华为云开发者联盟 华为云GaussDB(DWS) 企业号2024年4月PK榜

捷途山海T2携手坦克300 Hi4-T上市,消费者该如何选择?

极客天地

OpenHarmony NAPI开发 主讲人:连志安

Laval小助手

物资管理的挑战与机遇:利用技术提升效率与可持续性

天津汇柏科技有限公司

遥控车模的电机控制器

芯动大师

控制 驱动 无刷电机

企业数字化转型,人才是关键。华为政企咨询如何赋能客户高效培养数字化人才?

平平无奇爱好科技

Linux设备驱动系列(四)——设备号

Linux内核拾遗

linux开发 Linux内核 设备驱动

凭证管理揭秘:Cookie-Session 与 JWT 方案的对决

Phoenix

安全架构 会话管理

如何延长LED显示屏的使用寿命

Dylan

环境 角色 LED显示屏 全彩LED显示屏 led显示屏厂家

一次故障演练,十分钟自动搞定?

华为云开发者联盟

运维 华为云 企业号2024年4月PK榜 华为云开发和联盟

国产化替代进程中金融行业的中间件

Onegun

信创 国产化

C# 8新提案让泛型Attribute成为现实_语言 & 开发_Jonathan Allen_InfoQ精选文章