c# 技巧之 泛型方法
泛型 指的是编译时不需要指定具体的参数类型,可以在运行时动态地赋予某一种数据类型的机制。 相信很多人对泛型类并不陌生,像Dictionary,List等结构都属于泛型类。有趣的是,一个函数/方法也可以泛化。
假如我们需要些一个函数,这个函数负责某一种逻辑操作(例如排序、求和、个数统计等),而不关心具体要操作的数据类型是什么,那么为了使这个函数变得更通用,就可以写成泛型方法。
举一个我遇到的简单例子:
项目中经常要写读文件,生成key-value 结构的字典。 每次都写StreamReader 和 Dicitonary 的句子会让人感觉码农真是一份无聊的职业。于是写了一个通用的加载key-value 字典的泛型方法:
class Common
{
internal static Dictionary<T1, T2> LoadDict<T1, T2>(string file, char sep, bool hasHeader = false, int keyidx=, int valueidx=)
{
Dictionary<T1, T2> res = new Dictionary<T1, T2>();
using (StreamReader rd = new StreamReader(file))
{
string content = "";
if (hasHeader)
rd.ReadLine(); while ((content = rd.ReadLine()) != null)
{
string[] words = content.Split(sep);
T1 key = (T1) Convert.ChangeType(words[keyidx], typeof(T1));
T2 value = (T2)Convert.ChangeType(words[valueidx], typeof(T2)); if (!res.ContainsKey(key))
res.Add(key, value);
}
} return res;
}
}
这样只要调用Common.LoadDict<string,int>( filename, ...) 就可以了。这个函数就像是一个模板,在运行时再确定要使用什么样的数据类型。
注意其中关于类型转换的代码:
T1 key = (T1) Convert.ChangeType(words[keyidx], typeof(T1));
如果类型操作还有更细致的要求,那么可以这样:
if (typeof(T) == typeof(int))
{ ... }
else if (typeof(T) == typeof(double))
{ ... }
else
...
c# 技巧之 泛型方法的更多相关文章
- C#中泛型方法与泛型接口 C#泛型接口 List<IAll> arssr = new List<IAll>(); interface IPerson<T> c# List<接口>小技巧 泛型接口协变逆变的几个问题
http://blog.csdn.net/aladdinty/article/details/3486532 using System; using System.Collections.Generi ...
- .NET框架设计(常被忽视的C#设计技巧)
阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...
- 使用Unity3D的50个技巧
使用Unity3D的50个技巧 刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址:ht ...
- .net 动态代理的泛型方法支持问题
最近一直在做.net平台下的高速服务框架.其中有一个问题一直困扰着我:通过动态代理RealProxy创建的服务代理,不支持泛型方法调用.比如: 接口声明: public interface IMete ...
- 使用Unity3D的50个技巧:Unity3D最佳实践
翻译故事 原文:http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ 这篇技巧,我自己也在翻译, ...
- .NET框架设计—常被忽视的C#设计技巧
.NET框架设计—常被忽视的C#设计技巧 阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你 ...
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...
- .NET Core 技巧汇总篇
前言 本篇幅会专门记录在工作中实际碰到的问题场景,和一些比较好的实现方法作为汇总,可以供各位借鉴和参考,当然 本人入行不深,能力有限,仅供各位借鉴和参考.欢迎补充 技巧一:引入其他项目类库文件 做项目 ...
- 【转载】 .NET框架设计—常被忽视的C#设计技巧
阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...
随机推荐
- XtraScheduler 日程控件显示自定义标题
下面代码实现一个自定义日程标题 public class CustomHeaderCaptionService : HeaderCaptionServiceWrapper { public Custo ...
- Bootstrap的优先级、选择器、伪类
概述:Bootstrap的CSS组件的核心就是选择器的定义以及在各自优先级上的处理.由于大部分的选择器都非常的常见就一笔带过了,这里重点介绍一下Bootstrap用到的知识点. 一.优先级 之前我们使 ...
- ASCII
0. American Standard Code of Information Interchange 美国信息交换标准码, 即ASCII, 定义表如下: Bin(二进制) Oct(八进制) Dec ...
- 数据仓库建模与ETL实践技巧
数据分析系统的总体架构分为四个部分 —— 源系统.数据仓库.多维数据库.客户端(图一:pic1.bmp) 其中,数据仓库(DW)起到了数据大集中的作用.通过数据抽取,把数据从源系统源源不断地抽取出来, ...
- Effective Java 33 Use EnumMap instead of ordinal indexing
Wrong practice: Putting sets into an array indexed by the type's ordinal /** * Added demo for the &q ...
- 读书笔记——数据库的ADO开发总结
基本上是对 ADO+开发指南.pdf 的摘抄和总结,以及个人心得. 文章末尾有<ADO+开发指南.pdf>的资源下载,附带个人批注. --------------------------- ...
- 数据结构--树状数组&&线段树--基本操作
随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...
- Java SWT 做计算器。
java -- swt - - 计算器 环境搭建 安装java.eclipse.以及对应的swt插件. 开始工程 建立工程: 在java下建立一个在其他 —- WindowsBuilder — ...
- nginx 平滑升级tengine
wget http://tengine.taobao.org/download/tengine-1.5.1.tar.gz //下载Tengine1.5.1版本 tar zxvf tengine-1. ...
- IL查看泛型
查看泛型的IL 我们在开发中经常用到泛型,下面一起通过IL来查看泛型背后做了那些工作 示例代码 示例代码如下: using System; namespace MyCollection { pub ...