HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

京东工业平台API:关键词搜索京东工业平台商品列表数据接口

tbapi

京东API接口 京东工业平台API 京东工业平台商品列表接口 京东工业平台商品数据接口

源码补丁神器—patch-package

京东科技开发者

TapData 信创数据源 | 国产信创数据库 TiDB 数据迁移指南,加速国产化进程,推进自主创新建设

tapdata

【YashanDB知识库】如何远程连接、使用YashanDB?

YashanDB

yashandb 崖山数据库 崖山DB

fx框架上手-基础篇

FunTester

记录一次RPC服务有损上线的分析过程

京东科技开发者

精选开源项目管理系统:为您的团队挑选最佳选项

爱吃小舅的鱼

项目管理 开源系统

InPlant SCADA笔记 day1与首次安装

万里无云万里天

工厂运维 InPlant SCADA

“新质互联网”解读:新在哪里,利在何处?

Alter

从历史到未来,看技术发展趋势

凌晞

技术 科技 构架

探索 Milvus 数据存储系统:如何评估和优化 Milvus 存储性能

Zilliz

人工智能 AI Milvus Zilliz 向量数据库

日志框架简介-Slf4j+Logback入门实践

京东科技开发者

照明黑马智谋纪,让小白玩转AI照明

编程猫

ChinaJoy 2024启动!西部数据展示丰富游戏存储解决方案让发烧友直面各式挑战

Geek_2d6073

使用 Easysearch 打造企业内部知识问答系统

极限实验室

easysearch 征文系列

搭建自动化 Web 页面性能检测系统 —— 部署篇

EquatorCoco

运维 前端 自动化 Web

Git的存储原理

快乐非自愿限量之名

git

使用线程池你应该知道的知识点

不在线第一只蜗牛

Java 线程池

Spring 常用的三种拦截器详解

快乐非自愿限量之名

Java spring Spring Boot

AutoMQ 开源可观测性方案:夜莺 Flashcat

AutoMQ

云计算 kafka 云原生 Apache Kafka AutoMQ

TinyVue 组件库官网焕然一新!

OpenTiny社区

Vue 组件库 OpenTiny

8款好用的PPT免费生成器推荐,堪称办公神器!

彭宏豪95

效率工具 职场 PPT AIGC AI生成PPT

2024 年美国大选将如何影响 Web3 行业?

股市老人

借助大语言模型快速升级你的 Java 应用程序

亚马逊云科技 (Amazon Web Services)

java

让 AI 无处不在,英特尔揭秘 AI 与边缘技术结合的未来画卷

E科讯

医疗器械行业数智化创新实践:数据可视化与 AI+ 是实现高质量发展的关键

tapdata

开个技术外挂|电池热失控致电车自燃爆炸?用仿真技术解决它!

Altair RapidMiner

电动汽车 电池 仿真 altair 新能源车

以太坊 ETF 获批:如何影响 Web3

股市老人

Java 内推 | 教育行业缺口来了,研发,运维,产品,教研,职能,营销... 别错过

Seachal

Java 内推

基于Drone实现CI/CD【0到1架构系列】

不在线第一只蜗牛

Java 架构 CI/CD

低代码应用版本管理能力探讨

鲸品堂

低代码 版本管理工具 版本管理 企业号2024年7月PK榜

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