C#泛型基础

    // 泛型约束意义  不会有类型安全问题  让开发者合理调配
    //    .NET支持的类型参数约束有以下五种:
    //where T : struct                               | T必须是一个结构类型
    //where T : class                                | T必须是一个Class类型   引用类型 
    //where T : new()                              | T必须要有一个无参构造函数
    //where T : NameOfBaseClass           | T必须继承名为NameOfBaseClass的类
    //where T : NameOfInterface            | T必须实现名为NameOfInterface的接口
    public class TModel
    {

        // 这表示GetSomethingList是个泛型方法,调用的时候需要确定T到底是什么类型,但这里类型T需满足 where T:class,new() 这个条件,

        //其中 where T:class,表示T必须是引用类型(而不是int等值类型,或者ValueType的其他子类),new() 表示这个类型T还必须至少具备一个无参的构造函数(还可以有其他有参数的构造函数)。

        //如果对类型T只要求其中一个条件,可以写成
        //        1) where T:class //表示T必须是引用类型

        //2) where T:new() //表示这个类型T还必须至少具备一个无参的构造函数
        public List<T> GetSomethingList<T>(int a) where T : class, new()
        {
            List<T> list = new List<T>();
            return list;
        }
        /// <summary>
        /// 引用类型 约束  约束
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        /// <returns></returns>
        public List<T> GetSomethingList2<T>(int a) where T : class
        {
            List<T> list = new List<T>();
            return list;
        }
        /// <summary>
        /// 值类型约束
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        /// <returns></returns>
        public List<T> GetSomethingList2ew<T>(int a) where T : struct
        {
            //2个大括号 是作用域
            {

            }
            List<T> list = new List<T>();
            return list;
        }
        /// <summary>
        ///  where 就是约束 代表要调用此方法就得按这个方法的规矩  下面是约束无参构造函数
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a"></param>
        /// <returns></returns>
        public List<T> GetSomethingList3<T>(int a) where T : new()
        {
            List<T> list = new List<T>();
            return list;
        }
        public List<T> GetSomethingList4<T>(int a) where T : wwwww
        {
            List<T> list = new List<T>();
            return list;
        }
        public List<T> GetSomethingList5<T>(int a) where T : niubi
        {
            List<T> list = new List<T>();
            return list;
        }
        /// <summary>
        /// T是引用类型还必须是无参数构造 如何验证?
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TA"></typeparam>
        /// <returns></returns>
        public static string aaasdsadw<T, TA>() where T : class, new() where TA : class, new()
        {

            var s = new TA();
            var p = typeof(T);
            var new_props = new List<System.Reflection.PropertyInfo>();
            new_props.Add(p.GetProperties().FirstOrDefault());
            return "";
        }

        public List<T> GetSomethingList6<T, B, C>(int a) where T : class where B : struct where C : new()
        {
            List<T> list = new List<T>();
            return list;
        }

        public class 实现上面的泛型
        {
            public class list1
            {
                public list1()
                {

                }
            }
            public class list2
            {
                public list2(int b)
                {

                }
            }
            public void 开始实现()
            {
                TModel model = new TModel();
                {
                    var ss = model.GetSomethingList<list1>(1);
                }
                {
                    var ss = model.GetSomethingList2<list2>(1);
                }
                {
                    var ss = model.GetSomethingList2ew<int>(1);

                }
                {
                    var ss = model.GetSomethingList3<long>(1);
                }
                {
                    var ss = model.GetSomethingList4<wwwww>(1);
                }
                {
                    var ss = model.GetSomethingList5<niubi>(1);
                }
                {
                    //var ss = TModel.aaasdsadw<list1, list1>();
                    //var ssew = TModel.aaasdsadw<list1, list2>();
                }
                {
                    var ss = model.GetSomethingList6<list2,int, list1>(1);
                    
                }
            }

        } 
 }

  

posted @ 2022-12-08 18:04  奉利民  阅读(14)  评论(0编辑  收藏  举报