zoukankan      html  css  js  c++  java
  • 泛型约束

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    //泛型命名空间: System.Collections.Generic
    //如: List<T>、IComparable<T>
    //参考:https://msdn.microsoft.com/zh-cn/library/sx2bwtw7.aspx
    //http://biancheng.dnbcw.info/net/358503.html
    namespace WpfApplication1
    {
        //这个泛型类只接受值类型的泛型参数 
        public class MyClass2
        {
            
        }
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            #region T:结构
            /// <summary>
            /// 调用:
            /// float _float = StructA<float>(1);   //结果:2.0,约束为返回float类型
            /// </summary>
            /// <typeparam name="T">约束T</typeparam>
            /// <param name="arg">int</param>
            /// <returns>返回T</returns>
            private T StructA<T>(int arg) where T : struct
            {
                double db = 1.0 + arg;
                return (T)Convert.ChangeType(db, typeof(T));
            }
            /// <summary>
            /// 调用:
            /// int _int = StructB<int>(1);         //结果:2,约束为返回int类型
            /// </summary>
            /// <typeparam name="T">约束T</typeparam>
            /// <param name="arg">任意类型</param>
            /// <returns>返回T</returns>
            private T StructB<T>(T arg) where T : struct
            {
                double db = 1.0 + (double)Convert.ChangeType(arg, typeof(double));
                return (T)Convert.ChangeType(db, typeof(T));
            }
            /// <summary>
            /// 调用:
            /// float? y = 1;
            /// float _float = StructC(y);         //结果:2.0,约束为返回float类型
            /// </summary>
            /// <typeparam name="T">约束T</typeparam>
            /// <param name="arg">任意可空类型</param>
            /// <returns>返回T</returns>
            private T StructC<T>(T? arg) where T : struct
            {
                double db = 1.0 + (double)Convert.ChangeType(arg, typeof(double));
                return (T)Convert.ChangeType(db, typeof(T));
            }
            #endregion
    
            private T Foo<T>(T arg) where T : class
            {
                double db = 1.0 + (double)Convert.ChangeType(arg, typeof(double));
                return (T)Convert.ChangeType(db, typeof(T));
            }
            public MainWindow()
            {
                InitializeComponent();
                /*泛型模板实例化*/
    
                //T:class
                实现<类别> gci = new 实现<类别>();
                gci.Insert(new 类别() { _int = 1, _float = 2, _double = 3.0 });
                
                //T:new()
                InstanceA<string> testa = new InstanceA<string>("hello");
                string str = testa.obj;
                //调用委托
                InstanceA<float>.StackDelegate ds = DoWork;
    
                InstanceB<类别> testb = new InstanceB<类别>();
                //委托
                //调用方式一
                DelegateT<string> dt = Method;
                string dts = dt("hello");       //结果:hello
                //调用方式二
                DelegateT<string> d = new DelegateT<string>(Method);
                dts = dt("hello");
    
            }
            static string Method(string s) { return s; }
            delegate string DelegateT<T>(T value);
            delegate T MyDelegate<T>() where T : new();
            private static void DoWork(float[] items) { }
            //自定义泛型约束
            //public bool MyMethod<T>(T t) where T : IMyInterface { }
        }
        #region T:new()
        //<T>为任意类型
        public class InstanceA<T>
        {
            public T obj{set;get;}
            public InstanceA(T obj)
            {            
                this.obj = obj;
            }
            //创建泛型实例对像
            public static T Instance()
            {
                T t = System.Activator.CreateInstance<T>();
                return t;
            }        
            public delegate void StackDelegate(T[] items);
        }
        //where T:new()指明了创建T的实例时应该具有构造函数。
        //new()约束,要求类型参数必须提供一个无参数的构造函数。 
        public class InstanceB<T> where T : new()
        {
            public static T Instance()
            {
                T t = new T();
                return t;
            }
        }
        //where T: 类别,T表示类型变量是继承于“类别”
        public class InstanceC<T> where T : 类别
        { }
        #endregion
    
        #region T:class
        interface 接口<T> where T : class
        {
            void Insert(T entity);
            void Update(T entity);
        }
        public class 实现<T> : 接口<T> where T : class
        {
            public void Insert(T entity)
            {
                
            }
            public void Update(T entity)
            {
    
            }
        }
        public class 类别
        {
            public 类别() { }
            public int _int { set; get; }
            public float _float { set; get; }
            public double _double { set; get; }
        }
        #endregion
    
        // 传人T类型,但T类型必须是IComparable类型
        public class GenericClass<T> where T : IComparable { }
        //传人T和U类型,但T类型必须是class类型,U类型必须是struct类型
        public class MyClass<T, U>where T : class where U : struct{ }    
    }
    
  • 相关阅读:
    SQL SERVER NVARCHAR字段INSERT 中文乱码问题解决
    解析$(this).data('type');
    使用HttpWebRequest发送自定义POST请求
    C#使用WebClient下载文件到本地目录
    linux开发时,想用的链接暂存
    程序进行重定位的技术按重定位的时机分类
    文件分类
    快表、页表
    操作系统的发展与分类
    网络操作系统和分布式操作系统的区别
  • 原文地址:https://www.cnblogs.com/sntetwt/p/5353362.html
Copyright © 2011-2022 走看看