这是一篇关于泛型的类型判断的总结文,对
.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吧,不太记得了