c#进阶学习--泛型

一、概述

      我们为什么要用泛型?简而言之是为了提高代码的泛用性,所以才存在的。假设我需要处理十个类,并且对十个类处理的方法都一样,如果没有泛型的话那么我们需要定义十个方法来处理不同的类,你或许可以将方法中公用的部分提取出来,但是声明十个方法是不可避免的,但是有了泛型就不一样了,我们可以将十个方法变为一个方法,大大的简化了开发的步骤。

 

、包含泛型方法的创建与使用

方法的创建

        static bool compare<T>(T first, T second) where T:class
        {
            if (first == null || second==null)
            { return false; }
            else { return first == second; }
        }

    在普通的方法后加上<泛型名称>声明一个带泛型参数的方法,泛型类可作为输入和输出的类型使用。泛型可以设置泛型约束条件来作为泛型的规范,语法为 方法后加 where 泛型名称:约束条件,上面的代码中泛型必须为一个class,基础的泛型条件除了class还有struct,Stream,IDisposable等,约束new()会检查类型实参是否有一个可用于创建类型示例的无参数构造函数,此外约束还可以是其他自定义的类,这样做泛型参数就必须是类本身或者该类的子类。 泛型可一次性声明多个,并且每个泛型类型也可以绑定多个不互相冲突的约束条件。

操作如下:

 class father
    {
       public int? len1 = 5;
    }
    class child:father
    {
        public int len2 = 6;
    }
    class child2 : father
    {
        public int len3 = 6;
    }

    class 泛型
    {
        static bool compare<T>(T first, T second) where T : father
        {
            return first.len1 + 1 == second.len1;
        }
        static void Main(string[] args)
        {
            child ch1 = new child();
            ch1.len1 = 4;
            child ch2 = new child();
            Console.WriteLine( compare(ch1, ch2));
        }
   }

输出:

此外我们还能够使用System.Activator.CreateInstance<T>()对泛型来进行实例化操作与使用:

        private static List<T> getTList<T>(int num)
        {
            List<T> TList=new List<T>();
            for (int i = 0; i < num;i++ )
            { TList.Add( System.Activator.CreateInstance<T>()); }
            return TList;
        }

        static void Main(string[] args)
        {
          var ListData = getTList<father>(5);
          Console.WriteLine("条数:"+ListData.Count());
        }

输出:

 

 

甚至可以利用反射来对实例化之后的泛型进行赋值操作,以下是datatable对与其相应泛型的list的转化。

        public static void getModeList<T>(DataTable dtData, out List<T> ModeList) where T:BASE
        {
            ModeList = new List<T>();
            //通过反射将datatable加载到相应的list中
            foreach(DataRow drData in dtData.Rows)
            {
                T Mode = System.Activator.CreateInstance<T>();
                foreach (DataColumn dcData in dtData.Columns)
                {
                    Type tp = Mode.GetType().GetField(dcData.ColumnName.ToLower()).FieldType;
                    if (drData[dcData.ColumnName] == DBNull.Value)
                    { continue; }
                   Mode.GetType().GetField(dcData.ColumnName.ToLower()).SetValue(Mode, Convert.ChangeType(drData[dcData.ColumnName], (tp == typeof(double?))?typeof(double):tp)); 
                }
                ModeList.Add(Mode);
            }
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

why070809123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值