写点什么

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

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

关注

评论

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

GitHub上标星68k,基于SpringBoot+Netty分布式开源的即时通讯系统项目

Java架构之路

Java 程序员 编程语言 Netty 项目实战

谈谈测试

BigBang!

测试的价值 测试文化 测试落地

LeetCode题解:242. 有效的字母异位词,数组排序,JavaScript,详细注释

Lee Chen

大前端 LeetCode

国内上市进程或将提速!百度宣布小度科技独立融资

脑极体

关于 UML 类图

西贝

UML 图表

架构师训练营 - 作业 - 第二周

Max2012

太牛了,这份神仙级面试笔记把所有 Java 知识面试题都详解出来了

Java架构之路

Java 程序员 面试 编程语言

一个草根的日常杂碎(9月29日)

刘新吾

随笔杂谈 生活记录 社会百态

极光无限:用AI赋能安全 解决安全行业人才紧缺难题

风向标

人工智能

第三周学习代码重构总结

三板斧

极客大学架构师训练营

全文!马云对数字时代全球化的全新解读

CECBC

全球化 数字时代

代码重构 - 课后作业

Nick~毓

软件架构(2)-框架设计

Zeke

极客大学架构师训练营

深入剖析 | Java15语法特性

九叔(高翔龙)

Java 架构 Java 分布式 java15新特性

从三个产业侧影,打开万物智能的应用之匙

脑极体

单例模式

knight

区块链掀起全民创业热潮!数字资产是未来全球最具前景和价值的!

CECBC

区块链 数字货币

甲方日常 25

句子

生活 随笔杂谈 日常

中秋佳节,程序员教你AI三步成诗,秒变“李白”

华为云开发者联盟

AI 中秋

2020HC大会上,这群人在讨论云原生…

华为云开发者联盟

华为 华为云 大会

在vue2中使用ts

正经工程师

typescript vue.js

一周信创舆情观察(9.21~9.27)

统小信uos

2020互联网公司中秋礼盒大比拼!(文末送福利)

Java架构师迁哥

技术解读丨目标检测之RepPoints系列算法

华为云开发者联盟

算法 神经 目标检查

阿里内部超流行的“SpringBoot+ 微服务指南”,理论与实战双管齐下

Java架构之路

Java 程序员 微服务 Spring Boot 编程语言

开源=免费?

Philips

开源 开源社区

上手深度学习之前,我们先聊聊“数学”

华为云开发者联盟

神经网络 学习 数学

数据库选型入门必读:如何在眼花缭乱的产品中挑出最适合业务的?

华为云开发者联盟

数据库 数据库选择 关系型

重塑产业+价值共识,区块链助力供应链金融数字化

CECBC

区块链 供应链物链

架构师训练营 1 期第 3 周:代码重构 - 作业

piercebn

极客大学架构师训练营

架构师训练营 1 期 - 第三周 - 设计模式

三板斧

极客大学架构师训练营

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