写点什么

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

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

关注

评论

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

Go编译原理系列4(语法分析)

书旅

Go 编译 计算机基础 编译原理

18款口碑爆棚手机浏览器,被一网打尽了

Jackpop

数据库设计三范式

Ayue、

MySQL 1月月更

被忽视的问题:测试环境稳定性治理

老张

测试环境 稳定性治理

拆分电商系统为微服务

ren

模块四作业 - 学生管理系统的考试试卷存储方案

曾竞超

「架构实战营」

在 Flutter 中发出 HTTP 请求的最佳库(2022 年)

坚果

flutter 1月月更

工作方式发生了动荡?

Jackpop

架构实战营 4 期第四模块作业

jialuooooo

架构实战营

2022年推荐6个有意思的CSS tools!

CRMEB

模块五作业

Geek_e6f7f6

架构训练营

LabVIEW彩色图像分割(基础篇—14)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 图像分割 阈值处理

个人成长中,关于规划设计的思考

程序人生

办公专用!又一款开源免费”摸鱼“神器....

Jackpop

Python

Rust 元宇宙 18 —— 多场所共存的世界

Miracle

rust 元宇宙

Uber系统架构设计

俞凡

架构 大厂实践 uber

模块四作业

Geek_59dec2

试论架构师必备的基础能力

陈俊

架构 技术认知

【日拱一卒进击大厂系列】为什么单线程的Redis可以实现高并发访问

慕枫技术笔记

后端 1月月更

某反序列化漏洞分析与复现工作

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

log4j bug

你?

2022 年值得期待的元宇宙技术

devpoint

defi Web3.0 1月月更 NTF

爆肝一个月,我做了个免费的面试刷题网

程序员鱼皮

Java Python 编程 面试 计算机

[架构实战营] 模块五作业

Geek_0ed632

「架构实战营」

【Spring专场】「IOC容器」不看源码就带你认识核心流程以及运作原理

码界西柚

Spring Framework spring ioc 1月月更 框架原理

C#使用原生方法将文字朗读出来

喵叔

1月月更

Postman如何做接口测试1:如何导入 swagger 接口文档

和牛

测试

ReactNative进阶(八):connect

No Silver Bullet

React Native Redux 1月月更 connect

我最终选择VS Code

Jackpop

Failed to load module "canberra-gtk-module"

Ayosh

【网络安全】浅析跨域原理及如何实现跨域

H

网络安全 网络安全信息安全、

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