C#中泛型类和扩展方法如何使用

我们经常通过泛型构造函数创建泛型实例,也常调用实例的扩展方法。以下的代码在项目中随处可见:

        static void Main(string[] args)
        {
            var strs = new List<string> {"hello","world"};
            var result = strs.Where(s => s.StartsWith("h"));
            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

以上,

  • 通过泛型集合List<T>的构造函数创建了实例,内部是如何实现的呢?
  • 对实例变量strs采用Where方法,我们发现Where也足够”聪明”,因为它是针对IEnumerable集合类型的扩展方法。

.NET内部到底是如何实现的呢?不妨临摹一下~~

创建一个类型泛型。

    public class MyCute<T>
    {
        public MyCute(T t)
        {
            GetCute = t;
        }
        public T GetCute { get; set; }
    }

在客户端这样调用:

        static void Main(string[] args)
        {
            var cuteInt = new MyCute<int>(10);
            var cuteStr = new MyCute<string>("hello");
            Console.WriteLine(cuteInt.GetCute);
            Console.WriteLine(cuteStr.GetCute);
            Console.ReadKey();
        }

以上,或许得到的启示是:如果想通过构造函数创建泛型实例,需要定义一个泛型类,一个泛型类型的属性,一个把泛型类型作为参数的构造方法。

现在想对泛型实例cuteInt和cuteStr的属性GetCute使用扩展方法,如何做呢?

cuteInt的属性GetCute是int类型,cuteStr的属性GetCute是string类型,两者的共同基类是object,那就针对object类型写一个扩展方法。

    public static class MyHelper
    {
        public static string GetStr(this object obj)
        {
            return obj.ToString() + "--added string";
        }
    }

客户端变成这样:

        static void Main(string[] args)
        {
            var cuteInt = new MyCute<int>(10);
            var cuteStr = new MyCute<string>("hello");
            Console.WriteLine(cuteInt.GetCute.GetStr());
            Console.WriteLine(cuteStr.GetCute.GetStr());
            Console.ReadKey();
        }

总结:

  • 如果针对不同类型的操作逻辑是一样的,就可以抽象出一个泛型类。泛型类和普通类没有本质的区别,只不过在类名称后面多了一个占位符、或者叫类型参数,泛型类的构造函数参数是类型参数,泛型类的属性类型也是类型参数。
  • 如果针对不同类型实例的操作逻辑是一样的,就可以针对不同实例类型的共同父类或接口写一个扩展方法。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C# 泛型类(函数)的实例化小例子

    泛型可以用于类,也可以用于函数.如 泛型类: 复制代码 代码如下: public class MyClass<T> {     public T MyElement { get; set; } } 泛型函数: 复制代码 代码如下: public T ReturnElement<T>() {     throw new NotImplementedException(); } 但是当需要对MyElement进行实例化的时候,却不能使用new(),只要添加如下代码即可进行实例化了: 泛

  • 详解c# 泛型类的功能

    在泛型类中,由于不知道泛型参数T是什么类型,可能是引用类型,也可能是值类型,因此不能将null等赋予泛型类型.如何对泛型对象赋初值.如何保证泛型的正确性等,以使用泛型文档管理器为例: 文档管理器用于从队列中读写文档.首先创建一个泛型管理器AddDocument()方法添加一个文档到队列中,IsDocumentAvailabe只读属性指示队列中是否还有文档. public class DocumentManager<T> { private readonly Queue<T> doc

  • 深入浅析C#泛型类型

    上篇文章给大家介绍了浅析C# 中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c# 泛型类型, 说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我们代码瞬间就高大上了,当然只有一点点,真的只有一点点,因为后面要学习和掌握的知识还有很多.先来看下一个使用Dictionary<TKey,TValue>的例子. static void Main(string[] args) { Dictionary<int, string> result = GetAll(); }

  • C#泛型类型知识讲解

    概述 泛型类和泛型方法兼具可重用性.类型安全性和效率,这是非泛型类和非泛型方法无法实现的 泛型通常与集合以及作用于集合的方法一起使用 泛型所属命名空间:System.Collections.Generic 可以创建自定义泛型接口.泛型类.泛型方法.泛型事件和泛型委托,以提供自己的通用解决方案,设计类型安全的高效模式 泛型允许编写一个可以与任何数据类型一起工作的类或方法 示例 using System; using System.Collections.Generic; namespace Gen

  • C#泛型类创建与使用的方法

    本文实例为大家分享了C#泛型类创建与使用的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication13 { class Program { static void Main(string[] args) { Test<string,int> t = new Test<string,i

  • 介绍C# 泛型类在使用中约束

    首先看一下泛型的基本语法 访问修饰符 返回类型 泛型方法名 <T>(T 参数) 1):无法在泛型方法内部给任何 T 类型创建实例的对象,因为在泛型方法内部不知道传进来的对象有哪些构造函数2):约束是对内部的!(对于泛型方法)约束也是会被继承的! 3):给泛型类 加类型(引用类型,值类型)的约束:where T:class,new ( ) 遇到的问题:在写MongodbHelper类的时候,为了能处理多种类别,所以如下定义了该类: 复制代码 代码如下: public class MongodbH

  • 浅谈c# 泛型类的应用

    泛型类泛型类封装不是特定于具体数据类型的操作. 泛型类最常用于集合,如链接列表.哈希表.堆栈.队列.树等. 像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关.对大多集合类的操作,推荐使用 .NET Framework 类库中所提供的类.(1)泛型类可以继承具体类.封闭式构造.开放式构造基类. 复制代码 代码如下: class BaseNode { }class BaseNodeGeneric<T> { }// 继承具体类class NodeConcrete<

  • c# 泛型类型参数与约束的深入分析

    泛型类型参数简介在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符.泛型类型参数放在"<>"内.泛型类型参数命名建议:(1)当泛型类型参数为单个字母时,建议用T表示.(2)当泛型类型参数用单词定义时,建议在单词前加T. 复制代码 代码如下: private void PromptName<T>(T t) {}private void PromptName<Tuser>(Tuser user){} 泛型类型参数

  • c#自定义泛型类的实现

    闲来无事,自己研究了泛型类的简单的使用,where表示泛型约束,表示泛型类型中的参数只能是car类型,IEnumerable是一个接口,一个集合要支持FOREAch遍历,必须实现IEnumerable接口 复制代码 代码如下: public class Car    {        public string PetName;        public int Speed;        public Car(string name, int currentSpeed)        {  

  • C#中泛型类和扩展方法如何使用

    我们经常通过泛型构造函数创建泛型实例,也常调用实例的扩展方法.以下的代码在项目中随处可见: static void Main(string[] args) { var strs = new List<string> {"hello","world"}; var result = strs.Where(s => s.StartsWith("h")); foreach (var item in result) { Console.W

  • ES6中的数组扩展方法

    form 转化为真正的数组 先说一下使用场景,在Js中,我们要经常操作DOM,比如获取全部页面的input标签,并且找到类型为button的元素,然后给这个按钮注册一个点击事件,我们可能会这样操作: var inputObjs=document.getElementsByTagName('input'); for(var i=0;i<inputObjs.length;i++){ if(inputObjs[i].type==='button'){ inputObjs[i].onclick=func

  • JavaScript中ES6字符串扩展方法

    es6这个String对象倒是扩展了不少方法,但是很多都是跟字符编码相关,个人选了几个感觉比较常用的方法: includes 搜索字符的神器 还记得我们之前如何判断某个字符串对象是否包含特地字符的吗? var str='google'; if(str.indexOf('o')>-1){ console.log('yes'); }else{ console.log('no'); } indexOf本来只是一个获取字符对应位置的方法,因为找到不到会返回-1这个值,就成了判断是否包含的方法,inclu

  • C#中反射和扩展方法如何运用

    前段时间做了一个练手的小项目,名叫Book_Bar,用来卖书的,采用的是三层架构,也就是Models,IDAL,DAL,BLL 和 Web , 在DAL层中各个类中有一个方法比较常用,那就是RowToClass ,顾名思义,也就是将DataTable 中的数据封装到Models 中.结果导致在DAL各个类中写了很多类似的方法,后来就直接把它抽取出来做成了DataTable和DataRow的扩展方法,下面是代码: using System; using System.Collections.Gen

  • C#扩展方法实例分析

    本文实例讲述了C#扩展方法.分享给大家供大家参考,具体如下: 扩展方法 扩展方法使您能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 如果我们有这么一个需求,将一个字符串的第一个字符转化为大写,第二个字符到第n个字符转化为小写,其他的不变,那么我们该如何实现

  • 解析C#的扩展方法

    在使用面向对象的语言进行项目开发的过程中,较多的会使用到"继承"的特性,但是并非所有的场景都适合使用"继承"特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制

  • C# TextBox 扩展方法数据验证详细说明

    查看公司项目代码时,存在这样一个问题:winform界面上有很多信息填写,提交后台服务器更新,但数据的合法验证及值的转换却不太敢恭维,一堆的if判断和转换,便想着是否能扩展个方法出来,琢磨出个思路,记录下来与大家共同探讨,有不对的地方还请大家指正. 设计思路: 1. 由于大部分从TextBox控件中获取数据值,可以扩展个泛型方法出来,直接根据转换后的数据类型获得值,类似这样, var value = this.txtSample.GetValue<int>(); 2. 可以传入一个委托用来处理

  • C# 扩展方法小结

    在使用面向对象的语言进行项目开发的过程中,较多的会使用到"继承"的特性,但是并非所有的场景都适合使用"继承"特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制

  • 详解Java 缺失的特性扩展方法

    目录 什么是扩展方法 传统写法: 使用 Stream 写法: 在 Java 中怎么实现扩展方法 准备条件 编写扩展方法 数组扩展方法 扩展静态方法 建议 什么是扩展方法 扩展方法,就是能够向现有类型直接“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改现有类型.调用扩展方法的时候,与调用在类型中实际定义的方法相比没有明显的差异. 为什么需要扩展方法 考虑要实现这样的功能:从 Redis 取出包含多个商品ID的字符串后(每个商品ID使用英文逗号分隔),先对商品ID进行去重(并能够维持元

  • Jquery中扩展方法extend使用技巧

    在使用Jquery开发的过程中,extend是常用的参数处理函数,特别是对默认值的使用. Jquery的扩展方法原型是: var v=$.extend(dest,src1,src2,[,src3...]); 作用是把src1,src2,src3合并到到dest中并返回合并后的dest. 但是在使用过程中,默认值往往是不能被改变的, 如下: var defaut={'selector':'select','default':'默认值','backcolor':'#85e137','forecolo

随机推荐