AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

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

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

关注

评论

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

AISWare AntDB亚信科技数据库产品特性解读——平滑弹性扩展(一)

亚信AntDB数据库

亚信科技

Android 音视频 - MediaCodec 编解码音视频

声网

android 音视频 编解码

PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力

Serverless Devs

永不落幕的世界智能盛会:天津市工业和信息化局与工商银行天津分行举行对接交流活动

InfoQ 天津

浅谈如何实现自定义的 iterator

hedzr

stl Iterator c++17

网易云信 6 周年|以梦为马,谱写融合通信新篇章

网易云信

云通信 通信云

泛型原理解析(Review)

Puciu

泛型

文本逆序翻转工具

入门小站

工具

WorkPlus数字化办公解决方案,打造企业高效协同生态!

WorkPlus

【浪潮云说】直播间第十期将于今晚19:30准时开播

云计算

OCR+NLP 提取信息并分析,这个开源项目火了!

百度开发者中心

最佳实践 开源技术

公关CRM软件助你培养长期客户关系

低代码小观

CRM 管理系统 管理工具 管理软件 公关

如何成为一个更好的职业人?

石云升

学习笔记 职场经验 10月月更

linux之zgrep查找压缩包文件文本

入门小站

Linux

CODING 助力江苏高速信息实现组织敏捷与研发敏捷,领跑智慧交通新基建

CODING DevOps

研发敏捷 组织敏捷 自动化发布流程 团队目标一致性 楼宇智能化

万圣节也是节,准备好Trick or Treat了么?

气气

话题讨论

Python代码阅读(第47篇):从列表右边开始执行给定函数

Felix

Python 编程 Code Programing 阅读代码

作业:模块一

奔奔

阿里大牛首次公布Java10W字八股文面经,Github访问量破百万

Java 编程 程序员 架构 面试

中国央行数字货币DCEP——有增值空间吗?

CECBC

030云原生之交付部署

穿过生命散发芬芳

云原生 10月月更

Android平台如何使用RSA算法进行加解密?

Changing Lin

10月月更

微信朋友圈的复杂度分析

胡颖

架构实战营

虚拟人“觉醒”年,见证一场万物的进化

脑极体

北森CEO纪伟国:深耕HR SaaS,聚焦场景一体化

海比研究院

第六届世界智能大会平行论坛提前揭晓

InfoQ 天津

少吃肉也能减碳排?

脑极体

科技赋能乡村振兴,农林牧渔如何“拥抱”区块链技术?

CECBC

Serverless 工程实践 | 自建 Apache OpenWhisk 平台

Serverless Devs

OCR+NLP信息抽取在金融、物流行业的应用

百度大脑

人工智能 百度

使用 Spring Boot 和 @DataJpaTest 测试 JPA 查询

码语者

Java Spring Boot test

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