写点什么

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

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

关注

评论

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

ByteHouse:基于ClickHouse的实时数仓能力升级解读

字节跳动数据平台

数据库 大数据 数据分析 Clickhouse 企业号 2 月 PK 榜

Kubernetes环境cert-manager部署与应用

Galen Suen

Kubernetes TLS cert-manager Certificate Let's Encrypt

代码分享 | 情人节表白黑科技

鼎道智联

代码 情人节 爱心代码

CrossOver2023永久版虚拟机软件下载

茶色酒

CrossOver2023

状态机设计中的关键技术

timerring

FPGA

静态导航页设计与开发

码上生长

团队管理 导航网站 vue next

学习算法必备的《程序员代码面试指南》免费领取啦!!

小小怪下士

编程 程序员 算法 LeetCode 数据结构与算法

由ChatGPT引发的关于AI的一些思考

xiaoboey

AI ChatGPT

Ruby on rails入门

阿呆

ruby-on-rails

贝叶斯AB测试

俞凡

最佳实践 ab测试

支撑MVP,架构师需要做什么

agnostic

MVP

微信 API 中调用客服消息接口提示错误返回限制

HoneyMoose

状态机设计中的关键技术

timerring

FPGA

五分钟实现pdf分页

程序员架构进阶

PDF 2月春节不断更 源码搭建 2月日更 pdfbox

一文读懂 Zebec Chain 的“先行网络” Nautilus 链

西柚子

Camtasia2023Mac/win电脑屏幕录制编辑软件

茶色酒

Camtasia2023

热点面试题:协商缓存和强缓存的理解及区别?

Immerse

JavaScript https 面试题 HTTP 前端面试题

10w+训练标签?成本太高!PaddleNLP情感分析赋能消费“回暖”

飞桨PaddlePaddle

paddle nlp 飞桨

架构实战 6 - 电商微服务拆分

架构实战营 「架构实战营」

设计模式-组合模式和建筑者模式详解

C++后台开发

数据结构 设计模式 组合模式 后端开发 Linux服务器开发

自动驾驶过冬,需要点燃“降本增效”的炉火

脑极体

自动驾驶

泼辣修图2023最新版本修图工具功能介绍

茶色酒

泼辣修图2023

微信客服接口的返回数据

HoneyMoose

在 JavaScript 如何下载文件

devpoint

JavaScript Blob download

一文读懂 Zebec Chain 的“先行网络” Nautilus 链

股市老人

SpringBoot 三大开发工具,你都用过么?

程序员大彬

springboot

INFINI 产品更新啦 20230210

极限实验室

elasticsearch 极限实验室 极限网关 infini gateway INFINI Console

状态机设计中的关键技术

timerring

FPGA

一文读懂 Zebec Chain 的“先行网络” Nautilus 链

鳄鱼视界

DNS 原理及大规模高性能监测

郑州埃文科技

DNS

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