大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

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:075475
用户头像

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

关注

评论

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

使用Spring Data JPA的Specification构建数据库查询

Java 程序员 后端

做一名程序员的基本要求

Java 程序员 后端

先到先得!价值百万的的ELk+Lucene笔记,技术点拉满

Java 程序员 后端

先知道怎么手写一个分页查询,再去使用PageHelper吧

Java 程序员 后端

和12岁小同志搞创客开发:如何驱动 12864 OLED液晶显示屏?

不脱发的程序猿

少儿编程 智能硬件 创客开发 12864 OLED液晶显示屏

全是精华!阿里最新出品的“SpringCloud架构笔记” GitHub已爆火

Java 程序员 后端

活用向量数据库,普通散户也能找到潜力股!

Zilliz

数据库 Milvus 股票

和12岁小同志搞创客开发:手撕代码,Arduino IDE 软件下载和环境搭建

不脱发的程序猿

少儿编程 智能硬件 创客开发 Arduino

Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)

不脱发的程序猿

Python qt PyQt 调用UI文件 上位机开发

关于Spring注解容器配置的那些事,掌握这几点,不再难!

Java 程序员 后端

使用Spring

Java 程序员 后端

使用SpringCloudConfig进行分布式配置:存储库后端类型

Java 程序员 后端

这本现代魔法原理指南,把计算机体系掰开揉碎讲清楚了

Zilliz

编码

全新演绎!美团内部疯传Spring Boot速成手册也太香了(1)

Java 程序员 后端

关于Maven,这几个一定要会的知识点,你真的了解吗?

Java 程序员 后端

使用Spring Cloud Config进行分布式配置:Vault 后端

Java 程序员 后端

和12岁小同志搞创客开发:手撕代码,点亮LED灯

不脱发的程序猿

少儿编程 智能硬件 创客开发 Arduino

Python Qt GUI设计:窗口布局管理方法【基础】(基础篇—5)

不脱发的程序猿

Python qt GUI设计 Qt Designer 窗口布局方式

公司用算法考核程序员,与绩效挂钩,成绩太差将面临淘汰?

Java 程序员 后端

全文检索工具solr:第一章:理论知识

Java 程序员 后端

ajax跨域问题

加里都好

JavaScript ajax HTTP

全网最热Vue入门教程你不看就吃亏了哦

Java 程序员 后端

全网首发!撸了谷歌大神写的Spring源码笔记后,感觉之前读的都是渣渣

Java 程序员 后端

全链路压测必备基础组件之线程上下文管理之“三剑客”

Java 程序员 后端

毕业之后,开源给了我第一份工作

Zilliz

数据库 vim 开源 成长

入秋的第一篇数据结构算法:看看归并与快排的风采

Java 程序员 后端

全新演绎!美团内部疯传Spring Boot速成手册也太香了

Java 程序员 后端

全网最全Spring面试题之基础篇整理总结(共69题,附超详细解答)

Java 程序员 后端

全网最新最全面Java程序员面试清单(12专题5000解析)

Java 程序员 后端

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

Java 程序员 后端

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