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

C# 泛型函数

在这里插入图片描述

1.非约束

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace MyGeneirc
{public class GeneircMethod{/// <summary>/// 泛型方法解决,一个方法,满足不同参数类型,做相同的事情/// </summary>/// <typeparam name="T">类型名称</typeparam>/// <param name="tParam">参数对象</param>public static void Show<T>(T tParam){Console.WriteLine("当前类:{0},参数类型名称:{1}, 值:{2}",typeof(GeneircMethod), tParam.GetType().Name, tParam.ToString());}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace MyGeneirc
{internal class Program{static void Main(string[] args){try{// 变量定义int iValue = 123;string strValue = "456";DateTime dtValue = DateTime.Now;object oValue = "Mr Sorry";// 泛型方法调用 Console.WriteLine("****************Geneirc***********************");// 泛型方法解决,一个方法,满足不同参数类型,做相同的事情GeneircMethod.Show<int>(iValue);GeneircMethod.Show<string>(strValue);GeneircMethod.Show<DateTime>(dtValue);GeneircMethod.Show<object>(oValue);// 泛型类GenericClass<int> genericInt = new GenericClass<int> { _t = 19 };// 约束Console.WriteLine("****************约束非约束***********************");People people = new People() { Id = 123, Name = "张三" };Chinese chinese = new Chinese() { Id = 234, Name = "李四" };Hubei hubei = new Hubei() { Id = 456, Name = "王五" };Japanese japanese = new Japanese() { Id = 678, Name = "田中" };// 无意义显示GeneircMethod.Show<People>(people);GeneircMethod.Show<Chinese>(chinese);GeneircMethod.Show<Hubei>(hubei);GeneircMethod.Show<Japanese>(japanese); }catch(Exception ex) {Console.WriteLine(ex.ToString());}Console.ReadLine();}}
}

在这里插入图片描述

2.泛型约束

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace MyGeneirc
{public class Constraint{/// <summary>/// 泛型约束/// 1.权利 可以使用基类的一切属性方法/// 2.义务 强制保证T 一定是People 或 其子类(不能是密封类,)/// </summary>public static void Show<T>(T tParam)where T : People, ISports // 基类约束{Console.WriteLine("当前类:{0},ID:{1}, Name:{2}",typeof(Constraint), tParam.Id, tParam.Name);tParam.Hi();}// 泛型约束相比父类 可以叠加,更加灵活public static void ShowBase(People tParam){Console.WriteLine("当前类:{0},ID:{1}, Name:{2}",typeof(Constraint), tParam.Id, tParam.Name);tParam.Hi();}public static T Get<T>(T t)where T : ISports // 接口约束{t.Pinpang();return t;}public static T GetClass<T>(T t)where T : class // 引用类型约束{T tNew = null; // T 必须是引用类型return t;}public static T GetStruct<T>(T t)where T : struct // 值类型约束{// 默认类型 根据T的不同 赋予默认值T tNew = default(T); // T 必须是值类型return t;}public static T GetNew<T>(T t)where T : new() // 无参数构造函数约束{// new 对象T tNew = new T(); // T 类必须有构造函数(无参数)return t;}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace MyGeneirc
{internal class Program{static void Main(string[] args){try{People people = new People() { Id = 123, Name = "张三" };Chinese chinese = new Chinese() { Id = 234, Name = "李四" };Hubei hubei = new Hubei() { Id = 456, Name = "王五" };Japanese japanese = new Japanese() { Id = 678, Name = "田中" };Console.WriteLine("****************约束基类***********************");//Constraint.Show<People>(people);Constraint.Show<Chinese>(chinese);Constraint.Show<Hubei>(hubei);//Constraint.Show<Japanese>(japanese); // 编译报错Console.WriteLine("****************约束接口***********************");Constraint.Get<Chinese>(chinese);}catch(Exception ex) {Console.WriteLine(ex.ToString());}Console.ReadLine();}}
}

在这里插入图片描述

相关文章:

  • 毕业论文word常见问题
  • ElementUI中date-picker组件,怎么把大写月份改为阿拉伯数字月份(例如:一月、二月,改为1月、2月)
  • 【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
  • 为Android组件化项目搭建Maven私服
  • 洛谷 P1253 扶苏的问题 题解 线段树
  • 爬虫案例:有道翻译python逆向
  • 【中间件系列】浅析redis是否适合做消息队列
  • dots_image 增强图像中的圆点特征
  • 逆波兰表达式
  • three.js官方案例(animation / multiple)webgl_animation_multiple.html学习笔记
  • Redisson分布式锁原理解析
  • 深度解析:短剧市场的发展趋势
  • MFC实现子控件focus焦点上下移动父控件ListView和Gridview也跟着向上下移动
  • CogVLM2多模态开源大模型部署与使用
  • 聊聊二叉堆、红黑树、时间轮在定时任务中的应用
  • [Vue CLI 3] 配置解析之 css.extract
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 5、React组件事件详解
  • Angular6错误 Service: No provider for Renderer2
  • Asm.js的简单介绍
  • CSS盒模型深入
  • CSS魔法堂:Absolute Positioning就这个样
  • Go 语言编译器的 //go: 详解
  • Gradle 5.0 正式版发布
  • Javascript编码规范
  • java概述
  • Leetcode 27 Remove Element
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • overflow: hidden IE7无效
  • PAT A1017 优先队列
  • Python爬虫--- 1.3 BS4库的解析器
  • redis学习笔记(三):列表、集合、有序集合
  • Xmanager 远程桌面 CentOS 7
  • 彻底搞懂浏览器Event-loop
  • 读懂package.json -- 依赖管理
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 记一次用 NodeJs 实现模拟登录的思路
  • 实现菜单下拉伸展折叠效果demo
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #stm32驱动外设模块总结w5500模块
  • (12)Hive调优——count distinct去重优化
  • (2)STL算法之元素计数
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Ruby)Ubuntu12.04安装Rails环境
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (转)关于pipe()的详细解析
  • **PHP分步表单提交思路(分页表单提交)
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET delegate 委托 、 Event 事件,接口回调