zoukankan      html  css  js  c++  java
  • 关于泛型类和扩展方法的一点思考

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

            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();
    
            }    

    总结:

     

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

     

    ● 如果针对不同类型实例的操作逻辑是一样的,就可以针对不同实例类型的共同父类或接口写一个扩展方法。

  • 相关阅读:
    HDU 1025 Constructing Roads In JGShining's Kingdom (DP+二分)
    HDU 1158 Employment Planning
    HDU 2059 龟兔赛跑
    Csharp 简单操作Word模板文件
    Csharp windowform datagridview Clipboard TO EXCEL OR FROM EXCEL DATA 保存datagridview所有數據
    Csharp 讀寫文件內容搜索自動彈出 AutoCompleteMode
    Csharp windowform controls clear
    CSS DIV大图片右上角叠加小图片
    Csharp DataGridView自定义添加DateTimePicker控件日期列
    Csharp 打印Word文件默認打印機或選擇打印機設置代碼
  • 原文地址:https://www.cnblogs.com/darrenji/p/4452803.html
Copyright © 2011-2022 走看看