写点什么

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

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

关注

评论

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

低代码重新定义场景,如何拿到数字化转型的“新船票”?

秃头小帅oi

Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)

sysin

windows

《央国企数智化转型发展报告2025》调研正式启动,诚邀参与线上调研!

信通院IOMM数字化转型团队

数字化转型 数智化转型 央国企数智化转型 央国企数字化转型

越过“三重门”,萤石给出了商用清洁机器人的新解法

Alter

交易所开发:数字市场的核心动力

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台

阿里云大数据AI技术

大数据 spark Serverless EMR 美的

DeepSeek已接入!OpsPilot探索智能运维无限可能!

嘉为蓝鲸

智能运维 大模型 DeepSeek OpsPilot

Cisco Expressway Release X15.2.2 - 统一通信网关

sysin

Expressway

借助AI挖掘资产管理领域的新大陆

ServiceDesk_Plus

资产管理 IT资产管理 AI资产管理

DeepSeek 满血版在 VScode 和 IDEA 中怎么用?手把手教程来了

阿里云云效

阿里云 云原生 通义灵码 AI程序员 AI程序员体验官

当任务失败时,顶级调度系统如何实现分钟级数据补偿?

白鲸开源

大数据 开源 Apache DolphinScheduler 补数

什么是云解析DNS?云解析和普通解析有什么区别?

国科云

DeepSeek 满血版在 VScode 和 IDEA 中怎么用?手把手教程来了

阿里巴巴云原生

阿里云 云原生 通义灵码 AI程序员 AI程序员体验官

深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异

不在线第一只蜗牛

数据库 sql postgresql

什么是DApp?DApp开发指南

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

Nexpose 7.7.0 for Linux & Windows - 漏洞扫描

sysin

Nexpose

Windows 11 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 2 月更新)

sysin

windows

2025 年值得关注的 10 大SD-WAN厂商

Ogcloud

SD-WAN SD-WAN服务商 SD-WAN厂商 SD-WAN厂家 SD-WAN提供商

智能网络感知,打造极致流畅的鸿蒙版中国移动云盘图文体验

HarmonyOS SDK

RPA是什么技术?RPA能干什么探究RPA技术,洞悉其应用前景

Techinsight

RPA RPAxAI RPA Agent RPA智能体

低代码开发与人工智能协同创新:解码智慧养老产业数字化转型的技术路径与实践启示

不在线第一只蜗牛

给老系统做个安全检查——Burp & SqlMap扫描注入漏洞

为自己带盐

安全

LLMOps+DeepSeek:大模型升级一体化运维

嘉为蓝鲸

运维智能化 LLMOps LLM模型 DeepSeek DeepSeek v3

RPA软件格局现状:解读”最好“标准下的佼佼者

Techinsight

RPA RPA评测 RPAxAI RPA Agent RPA智能体

Windows 10 version 22H2 中文版、英文版下载 (2025 年 2 月更新)

sysin

Windows 10

再尝Semantic Kernel

为自己带盐

智能体

IoTDB 如何破解交通运输时序数据管理难题?

Apache IoTDB

Studio 3T 2025.3 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端

sysin

DeepSeek赋能企业研发,DevOps+AI新时代再升级!

嘉为蓝鲸

DevOps 模型管理 DeepSeek DeepSeek v3

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