当前位置: 首页 > news >正文

C# 8新提案让泛型Attribute成为现实

从一开始, Attribute就是.NET的一部分。因此,它们在引入泛型之前就已经被创建好,这意味着如果要引用属性中的类型,必须暴露一个Type参数或属性。例如:

[TypeConverter(typeof(X))]

这种模式存在一些限制。在上面的示例中,X必须有一个无参数的构造函数,并继承TypeConverter。编译器不会强制这些,所以开发人员只能在运行时发现错误。

相反,如果我们使用泛型类型参数,那么就可以在编译器强制执行这些规则,而且语法会稍微清晰一些。

[TypeConverter\u0026lt;X\u0026gt;]

理论上,“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\u0026lt;T\u0026gt;]public void DoSomething\u0026lt;T\u0026gt;(T input) { }

因为T不是在编译时定义的,因此反射机制就不知道这个表达式会返回什么。

typeof(GenericClass\u0026lt;\u0026gt;).GetMethod(\u0026quot;DoSomething\u0026quot;).GetCustomAttributes()

状态

目前,泛型Attribute功能列在C# 8路线图中,状态为“进行中”。

查看英文原文:https://www.infoq.com/news/2019/01/Generic-Attributes

相关文章:

  • v-if和v-for连用出现的问题
  • 导入javax.servlet。伺服登记无法解决:The import javax.servlet.MultipartConfigElement cannot be resolved...
  • 与柯尼塞格达成合作后 恒大或将继续瞄准中高端新能源车
  • eclipse 插件编写(一)(转)
  • 深入浅出Tomcat/3 - Tomcat生命周期
  • mybatis 学习总结笔记Day2
  • 5.3Python函数(三)
  • 基于LSTM的情感识别在鹅漫评论分析中的实践与应用
  • Docker学习笔记_安装和使用nginx
  • React Transition Group -- Transition 组件
  • 开源项目之ASP.NET Core + Vue.js 的前后端分离的通用后台管理系统框架
  • 客户端链接Blog
  • [IOI2018] werewolf 狼人
  • Docker学习笔记_安装和使用Python
  • JS正则表达式详解
  • 【刷算法】从上往下打印二叉树
  • 2017届校招提前批面试回顾
  • HTML-表单
  • Laravel 实践之路: 数据库迁移与数据填充
  • Python - 闭包Closure
  • React as a UI Runtime(五、列表)
  • Redis字符串类型内部编码剖析
  • RxJS: 简单入门
  • 免费小说阅读小程序
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 智能合约Solidity教程-事件和日志(一)
  • const的用法,特别是用在函数前面与后面的区别
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (C语言)字符分类函数
  • (二)Linux——Linux常用指令
  • (三)elasticsearch 源码之启动流程分析
  • (一)基于IDEA的JAVA基础10
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net Remoting常用部署结构
  • .NET 反射 Reflect
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net连接oracle数据库
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [100天算法】-目标和(day 79)
  • [Android Studio 权威教程]断点调试和高级调试
  • [Angular] 笔记 21:@ViewChild
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [CTO札记]盛大文学公司名称对联
  • [IE9] IE9 beta版下载链接
  • [Java] 图说 注解
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [leetcode] 103. 二叉树的锯齿形层次遍历
  • [LeetCode][138]【学习日记】深拷贝带有随机指针的链表
  • [LeetCode][LCR190]加密运算——全加器的实现