windows C#-泛型和特性

server/2024/12/2 23:51:31/

特性可按与非泛型类型相同的方式应用到泛型类型。 但是,只能将特性应用于开放式泛型类型和封闭式构造泛型类型,而不能应用于部分构造泛型类型。 开放式泛型类型是未指定任何类型参数的类型,例如 Dictionary<TKey, TValue>;封闭式构造泛型类型指定所有类型参数,例如 Dictionary<string, object>。 部分构造泛型类型指定一些(而非全部)类型参数。 示例为 Dictionary<string, TValue>。 未绑定泛型类型是省略类型参数的泛型类型,例如Dictionary<,>。

泛型和特性

以下示例使用此自定义属性:

class CustomAttribute : Attribute
{public object? info;
}

属性可以引用未绑定的泛型类型:

public class GenericClass1<T> { }[CustomAttribute(info = typeof(GenericClass1<>))]
class ClassA { }

通过使用适当数量的逗号指定多个类型参数。 在此示例中,GenericClass2 具有两个类型参数:

public class GenericClass2<T, U> { }[CustomAttribute(info = typeof(GenericClass2<,>))]
class ClassB { }

属性可引用封闭式构造泛型类型:

public class GenericClass3<T, U, V> { }[CustomAttribute(info = typeof(GenericClass3<int, double, string>))]
class ClassC { }

引用泛型类型参数的特性导致一个编译时错误:

[CustomAttribute(info = typeof(GenericClass3<int, T, string>))]  //Error CS0416
class ClassD<T> { }

从 C# 11 开始,泛型类型可以从 Attribute 继承:

public class CustomGenericAttribute<T> : Attribute { }  //Requires C# 11

若要在运行时获取有关泛型类型或类型参数的信息,可使用 System.Reflection 方法。

使用反射查询程序集的元数据 (LINQ) 

使用 .NET 反射 API 检查 .NET 程序集中的元数据,并创建位于该程序集中的类型、类型成员和参数的集合。 因为这些集合支持泛型 IEnumerable<T> 接口,所以可以使用 LINQ 查询它们。

下面的示例演示了如何将 LINQ 与反射配合使用以检索有关与指定搜索条件匹配的方法的特定元数据。 在这种情况下,该查询在返回数组等可枚举类型的程序集中查找所有方法的名称。

Assembly assembly = Assembly.Load("System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e");
var pubTypesQuery = from type in assembly.GetTypes()where type.IsPublicfrom method in type.GetMethods()where method.ReturnType.IsArray == true|| (method.ReturnType.GetInterface(typeof(System.Collections.Generic.IEnumerable<>).FullName!) != null&& method.ReturnType.FullName != "System.String")group method.ToString() by type.ToString();foreach (var groupOfMethods in pubTypesQuery)
{Console.WriteLine("Type: {0}", groupOfMethods.Key);foreach (var method in groupOfMethods){Console.WriteLine("  {0}", method);}
}

http://www.ppmy.cn/server/146868.html

相关文章

C++关于二叉树的具体实现

目录 1.二叉树的结构 2.创建一棵二叉树 3.二叉树的先序遍历 1.借助栈的先序遍历 2.利用递归的先序遍历 4.二叉树的中序遍历 5.二叉树的后序遍历 1.借助栈的后序遍历 2.利用递归的后序遍历 6.二叉树的层序遍历 7.tree.h 8.tree.cpp 9.main.cpp 1.二叉树的结构 对于…

【深度学习】四大图像分类网络之AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever&#xff08;均为Hinton的学生&#xff09;和Geoffrey Hinton&#xff08;被誉为”人工智能教父“&#xff0c;首先将反向传播用于多层神经网络&#xff09;在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…

JD - HotKey:缓存热 Key 管理的高效解决方案

JD - HotKey&#xff1a;缓存热 Key 管理的高效解决方案 文章目录 JD - HotKey&#xff1a;缓存热 Key 管理的高效解决方案一、JD - HotKey 概述二、核心设计理念&#xff08;一&#xff09;高效的热 Key 检测机制&#xff08;二&#xff09;灵活的热 Key 处理策略 三、系统架构…

Docker Buildx 与 CNB 多平台构建实践

一、Docker Buildx 功能介绍 docker buildx 是 Docker 提供的一个增强版构建工具&#xff0c;支持更强大的构建功能&#xff0c;特别是在构建多平台镜像和高效处理复杂 Docker 镜像方面。 1.1 主要功能 多平台构建支持 使用 docker buildx&#xff0c;可以在单台设备上构建…

Python 爬虫 (1)基础 | Request与Response

文章目录 一、Request包1、发送请求1.1、关键字参数1.2、应用示例 2、处理响应 前言&#xff1a; 在Python编程中&#xff0c;经常需要从互联网上获取或发送数据&#xff0c;这涉及到了网络编程。而在网络编程中&#xff0c;HTTP请求是不可或缺的一部分。Python的Requests包是一…

Vue构建错误解决:(error TS6133)xxx is declared but its value is never read.

TypeScript会检查代码中未使用的变量&#xff0c;如果vscode安装了Vue的语法检查工具&#xff0c;会看到告警提示&#xff0c;再npm run build的时候&#xff0c;这个警告会变成错误 解决方案1&#xff1a;删除定义了未使用的变量 推荐使用这种方案&#xff0c;能保证代码的质…

JAVA项目-------医院挂号系统

1&#xff0c;项目目的 1、科室管理&#xff1a;新增科室&#xff0c;删除科室&#xff08;如果有医生在&#xff0c;则不能删除该科室&#xff09;&#xff0c;修改科室。 2、医生管理&#xff1a;录入医生信息&#xff0c;以及科室信息。修改医生信息&#xff08;主要是修改…

【K8s】【部署】集群部署

1 主机/服务规划 主机IP主机名节点功能类型服务分布192.168.199.20k8s.master.vip vip虚拟IP192.168.199.21k8s01k8s-MasterKeepalived、HAProxy、Docker192.168.199.22k8s02k8s-MasterKeepalived、HAProxy、Docker192.168.199.23k8s03k8s-NodeDocker192.168.199.24k8s04k8s-N…