关于C#泛型的使用心得

这是一篇关于泛型的类型判断的总结文,对

.net framework的版本要求至少在4.7.2以上.

这个项目的版本是.net framework 4.7.2
还有一句要说明一下,tcpcilent这变量请忽略它.他是关于plc modbusTCP的读取.这篇文章主要还是讲泛型类型判断和类型约束.代码是整个项目的一小段复制过来的.博主比较懒不想改了
话不多上上代码,C#的泛型都可以定义泛型约束,这里的泛型约束时值类型
判断的泛型的三种方式;下面是第一种 case 后面直接跟类型并命名.这种方式是 T is 类型 变量名 的语法糖(就是简写);具体就是 if(T is bool){ bool b = Convert.ToBoolean(val);这里是随便拿个变量举个例子啊,上面是值类型的,这个引用类型的if(T is string){ string b =val as string}

        public bool Read<T>(ushort address, out T val) where T:IConvertible
        {
            val = default(T);
            OperateResult operateResult;
            switch (val)
            {
                case bool b:
                    operateResult = Tcpclient.ReadCoil(address.ToString());
                    break;
                case short s:
                    operateResult = Tcpclient.ReadInt16(address.ToString());
                    break;
                case ushort s:
                    operateResult = Tcpclient.ReadUInt16(address.ToString());
                    break;
                case int s:
                    operateResult = Tcpclient.ReadInt32(address.ToString());
                    break;
                case uint s:
                    operateResult = Tcpclient.ReadUInt32(address.ToString());
                    break;
                case long s:
                    operateResult = Tcpclient.ReadInt64(address.ToString());
                    break;
                case ulong s:
                    operateResult = Tcpclient.ReadUInt64(address.ToString());
                    break;
                case float s:
                    operateResult = Tcpclient.ReadFloat(address.ToString());
                    break;
                case double s:
                    operateResult = Tcpclient.ReadDouble(address.ToString());
                    break;
                    }
                    }

这里的泛型约束是数组类型,就是说可以用foreach遍历的类型
这个就是直接用typeof(T).Name属性直接判断的.还有一种是跟这个差不多的nameof(TypeCode.Boolean)这种方式是不适合数组类型的,只能是单个类型.因为这个枚举类型TypeCode没有数组的枚举(捂脸)

        public bool Read<T>(ushort address, out T val,ushort length) where T:IEnumerable
        {
            val = default(T);
            OperateResult operateResult;
            switch (typeof(T).Name)
            {
                case "Boolean[]":
                    operateResult = Tcpclient.ReadCoil(address.ToString(), length);
                    break;
                case "Int16[]":
                    operateResult = Tcpclient.ReadInt16(address.ToString(), length);
                    break;
                case "ushort[]":
                    operateResult = Tcpclient.ReadUInt16(address.ToString(), length);
                    break;
                case "int[]":
                    operateResult = Tcpclient.ReadInt32(address.ToString(), length);
                    break;
                case "uint[]":
                    operateResult = Tcpclient.ReadUInt32(address.ToString(), length);
                    break;
                case "long[]":
                    operateResult = Tcpclient.ReadInt64(address.ToString(), length);
                    break;
                case "ulong[]":
                    operateResult = Tcpclient.ReadUInt64(address.ToString(), length);
                    break;
                case "float[]":
                    operateResult = Tcpclient.ReadFloat(address.ToString(), length);
                    break;
                case "double[]":
                    operateResult = Tcpclient.ReadDouble(address.ToString(), length);
                    break;
                case "string":
                    operateResult = Tcpclient.ReadString(address.ToString(), length);
                    break;
                default:
                    return false;
            }
            }

这主要讲体现了泛型在多种类型的判断时所采用的switch判断模式,博主也是参考的许多文章才做出来的;
这里所讲的无论是 case bool b: 还是 nameof关键字 都是.net8.0的新特性.好像是8.0吧,不太记得了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Heping97

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

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

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

打赏作者

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

抵扣说明:

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

余额充值