Protobuf简单类型直接反序列化方法

本文介绍了如何在.NET环境中利用Protobuf进行跨平台的数据序列化和反序列化。重点讲解了如何处理泛型集合和简单对象的序列化,包括从字符串中获取类信息进行反序列化的方法。通过protobuf.net库,实现了动态加载类型并反序列化,同时探讨了不同类型序列化与反序列化的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个想法,有一个能够进行跨平台的高性能数据协议规范,能够让数据在两个不同的程序之间进行读取,最好能够支持直接将object序列化,那就完美了。

目标#
支持任意Object序列化
支持从类似System.String的字符串中获取类的信息并进行反序列化
支持简单对象的直接序列化与反序列化
方案#
Xml序列化#
说到序列化,.NET自带的XML序列化就很好用了,无奈有很多类型不支持,典型的比如Dictionary<>,而且这个东西虽然强大,但是xml的标签机制导致多余的内容比较多,空间占用会比较大。

Binary序列化#
支持任意object序列化,.NET还提供了BinaryFormatter。

Copy
// code from https://stackoverflow.com/questions/7442164/c-sharp-and-net-how-to-serialize-a-structure-into-a-byte-array-using-binary
MyObject obj = new MyObject();
byte[] bytes;
IFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, obj);
bytes = stream.ToArray();
}
这种方式支持任意的object进行序列化,不过有一个问题,它和Type模型严格绑定,只支持同一个程序集版本的消息交互,也不支持其他语言编写的程序。
我之前用过这种方式,用于单个程序内的数据快速保存与读取。这种情况下,只是单纯在为了保存object的状态,操作非常便捷,我认为非常合适。

Protobuf#
这个东西就是grpc中的数据格式,可以跨平台,支持多种语言,数据是二进制的,压缩率也很高。好吧,就是它了。

如果要在.NET中使用Protobuf协议,经常用的两个类库,一个是Google.Protobuf,另外一个是protobuf.net。详细的区别我就不赘述了,有一篇文章有多个对比。由于我比较喜欢直接使用C#的类型系统,所以我还是听从文章建议,直接使用protobuf.net了。

protobuf-net#
对于通信双方都是.NET程序的情况下,使用protobuf不需要直接编写proto文件,可以直接共享数据类的引用。如果是需要与非.NET程序进行通信的话,也可以通过工具生成,直接从proto中读取信息并生成类。回顾一下目标,一条条处理。

支持任意对象的序列化
protobuf通过定义实体类来进行序列化,所以也是支持任意对象的。这里我就不再详细说明了,可以在官网查看详细使用方法。

支持从类似System.String的字符串中获取类的信息并进行反序列化
一直有一个痛点,能否从序列化后的内容中还原一般对象,就是对象类型在编译的时候未知的那种。通过保存类型的string名称,在需要反序列化的时候,通过类型名称加载类型,将内容反序列化为指定类型。这个多多少少要用到反射了吧。

Copy
static void Main(string[] args)
{
var ps = new List { “1346dfg” , “31461sfghj”, “24576sth”} ;
var name = ps.GetType().FullName;
using (FileStream ms = new FileStream(“d:\a.txt”, FileMode.Create))
{
Serializer.Serialize(ms, ps);
}
using (FileStream ms = new FileStream(“d:\a.txt”, FileMode.Open))
{
//data已经转换为List对象,不过返回的类型还是object,可以强制转换。
dynamic data = Serializer.Deserialize(Type.GetType(name), ms);
Console.WriteLine(data[1]);
}
}
这里使用到了一个Type类型的FullName属性,对于内置类型对象,假设ps的类型是String的话,那个FullName为System.String,返回的内容很简单。但在这个例子中,FullName为System.Collections.Generic.List`1[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]],感觉一下子复杂了很多,而且要命的是,这里明确指明了CoreLib的引用,还有版本声明。如果需要在.NET Core3.1中反序列化,肯定是无法实现。

尝试解决一下,这个System.String不光在.NET 5中有,在其他.NET平台应该都可以支持,所以得想办法去掉System.String的尾巴。

可以试着对FullName下手,但是这个东西有点太长了,而且直接处理字符串我不是很喜欢;试着从Type类型下手。

Copy
var ty = Type.GetType(name);
Console.WriteLine(ty.Name);
Console.WriteLine(ty.Namespace);
Console.WriteLine(ty.GenericTypeArguments[0].Name);
Console.WriteLine(ty.GenericTypeArguments[0].Namespace);
//组合相关的代码
dynamic data = Serializer.Deserialize(Type.GetType($"{ty.Namespace}.{ty.Name}" +
$"[{ty.GenericTypeArguments[0].Namespace}.{ty.GenericTypeArguments[0].Name}]"), ms);

Console.WriteLine(data[1]);
稍微修改一下,通过手动连接Namespace与Name属性就可以达到我们的目的了。

List`1这个代表这个泛型里面只有一个参数,我这边就硬编码了,对于其他泛型,可能有多个参数,需要进行鉴别,并调整构造Type名称的代码。

我按照这个思路,完整的代码如下:

Copy
static void Main(string[] args)
{
var ps = new List { “1346dfg”, “31461sfghj”, “24576sth” };
var ty = ps.GetType();
//保存Type名称
var name = $"{ty.Namespace}.{ty.Name}" +
$"[{ty.GenericTypeArguments[0].Namespace}.{ty.GenericTypeArguments[0].Name}]";
//实际的程序不涉及文件操作,这里展示MemoryStream的用法。
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize(ms, ps);
//重置指针,从头开始读
ms.Position = 0;
//使用Type名称反序列化
dynamic data = Serializer.Deserialize(Type.GetType(name), ms);
Console.WriteLine(data[1]);
}
}
支持简单对象的直接序列化与反序列化
我说的简单对象,就是系统定义的泛型集合与直接有TypeCode,并且不是object的对象。补充一下,我常用的几种。
内置类型#
定义在System命名空间下的类型,包括DateTime,Int32之类的,都是直接System.类型名称的形式。

注意,int和float这种是不行的,需要使用Int32和Single。

泛型集合+内置类型#
泛型集合定义在System.Collections.Generic这个命名空间,所以组合起来为System.Collections.Generic.泛型名称`参数数量[System.类型名称]。举两个例子:

List的是System.Collections.Generic.List`1[System.String]。

Dictionary<int,string>的是System.Collections.Generic.Dictionary`2[[System.Int32],[System.String]]。

内置类型数组#
直接在名称后添加[]即可,形式为System.类型名称[]。

补充#
序列化操作不要求序列化的类型和反序列化的类型完全一致,比如说Array可以与List,IEnumerable进行互换。因此,一些单独定义的、结构比较简单的类型,可以通过内置类型进行反序列化,就没有必要在反序列化的时候加载原始的类了,简化了操作。

Copy
[ProtoContract]
public class Message
{
[ProtoMember(1)]
public List values { get; set; }
}

static void Main(string[] args)
{
var ps = new Message { values = new List { “1346dfg”, “31461sfghj”, “24576sth” } };

using (FileStream ms = new FileStream("d:\\a.txt", FileMode.Create))
{
    Serializer.Serialize(ms, ps);
}

using (FileStream ms = new FileStream("d:\\a.txt", FileMode.Open))
{
    //List<string>反序列化,而无需使用Message类。这里Message的FullName是"ConsoleApp6.Program+Message"
    dynamic data = Serializer.Deserialize(Type.GetType("System.Collections.Generic.List`1[System.String]"), ms);
    Console.WriteLine(data[1]);
}

}
另外,对于上面的dynamic,由于编译的时候不检查,怕操作错误的同学可以进行类型转换。分享一个代码段,可能能有点帮助。
https://github.com/qyf0xklw/donhtmaxdf/discussions/4
https://github.com/7jxumfpc/bssvddkhcx/discussions/5
https://github.com/qyf0xklw/donhtmaxdf/discussions/5
https://github.com/qyf0xklw/donhtmaxdf/discussions/6
https://github.com/7jxumfpc/bssvddkhcx/discussions/6
https://github.com/qyf0xklw/donhtmaxdf/discussions/7
https://github.com/7jxumfpc/bssvddkhcx/discussions/7
https://github.com/qyf0xklw/donhtmaxdf/discussions/8
https://github.com/7jxumfpc/bssvddkhcx/discussions/8
https://github.com/qyf0xklw/donhtmaxdf/discussions/9
https://github.com/7jxumfpc/bssvddkhcx/discussions/9
https://github.com/qyf0xklw/donhtmaxdf/discussions/10
https://github.com/7jxumfpc/bssvddkhcx/discussions/10
https://github.com/7jxumfpc/bssvddkhcx/discussions/11
https://github.com/7jxumfpc/bssvddkhcx/discussions/12
https://github.com/qyf0xklw/donhtmaxdf/discussions/11
https://github.com/7jxumfpc/bssvddkhcx/discussions/13
https://github.com/7jxumfpc/bssvddkhcx/discussions/14
https://github.com/qyf0xklw/donhtmaxdf/discussions/12
https://github.com/7jxumfpc/bssvddkhcx/discussions/15
https://github.com/7jxumfpc/bssvddkhcx/discussions/16
https://github.com/djvb5gwz/kdnyzskenz/discussions/74
https://github.com/tygq5nux/jkgibzxucg/discussions/78
https://github.com/djvb5gwz/kdnyzskenz/discussions/75
https://github.com/tygq5nux/jkgibzxucg/discussions/79
https://github.com/djvb5gwz/kdnyzskenz/discussions/76
https://github.com/djvb5gwz/kdnyzskenz/discussions/77
https://github.com/tygq5nux/jkgibzxucg/discussions/80
https://github.com/djvb5gwz/kdnyzskenz/discussions/78
https://github.com/tygq5nux/jkgibzxucg/discussions/81
https://github.com/djvb5gwz/kdnyzskenz/discussions/79
https://github.com/tygq5nux/jkgibzxucg/discussions/82
https://github.com/djvb5gwz/kdnyzskenz/discussions/80
https://github.com/tygq5nux/jkgibzxucg/discussions/83
https://github.com/djvb5gwz/kdnyzskenz/discussions/81
https://github.com/tygq5nux/jkgibzxucg/discussions/84
https://github.com/tygq5nux/jkgibzxucg/discussions/85
https://github.com/djvb5gwz/kdnyzskenz/discussions/82
https://github.com/tygq5nux/jkgibzxucg/discussions/86
https://github.com/djvb5gwz/kdnyzskenz/discussions/83
https://github.com/tygq5nux/jkgibzxucg/discussions/87
https://github.com/djvb5gwz/kdnyzskenz/discussions/84
https://github.com/tygq5nux/jkgibzxucg/discussions/88
https://github.com/djvb5gwz/kdnyzskenz/discussions/85
https://github.com/tygq5nux/jkgibzxucg/discussions/89
https://github.com/djvb5gwz/kdnyzskenz/discussions/86
https://github.com/tygq5nux/jkgibzxucg/discussions/90
https://github.com/djvb5gwz/kdnyzskenz/discussions/87
https://github.com/tygq5nux/jkgibzxucg/discussions/91
https://github.com/djvb5gwz/kdnyzskenz/discussions/88
https://github.com/tygq5nux/jkgibzxucg/discussions/92
https://github.com/djvb5gwz/kdnyzskenz/discussions/89
https://github.com/bolo3m2k/rdhslbggtt/discussions/42
https://github.com/bolo3m2k/rdhslbggtt/discussions/43
https://github.com/zjd6qwwu/xiellftjwv/discussions/39
https://github.com/zjd6qwwu/xiellftjwv/discussions/40
https://github.com/bolo3m2k/rdhslbggtt/discussions/44
https://github.com/bolo3m2k/rdhslbggtt/discussions/45
https://github.com/zjd6qwwu/xiellftjwv/discussions/41
https://github.com/zjd6qwwu/xiellftjwv/discussions/42
https://github.com/bolo3m2k/rdhslbggtt/discussions/46
https://github.com/bolo3m2k/rdhslbggtt/discussions/47
https://github.com/zjd6qwwu/xiellftjwv/discussions/43
https://github.com/zjd6qwwu/xiellftjwv/discussions/44
https://github.com/bolo3m2k/rdhslbggtt/discussions/48
https://github.com/bolo3m2k/rdhslbggtt/discussions/49
https://github.com/zjd6qwwu/xiellftjwv/discussions/45
https://github.com/zjd6qwwu/xiellftjwv/discussions/46
https://github.com/bolo3m2k/rdhslbggtt/discussions/50
https://github.com/zjd6qwwu/xiellftjwv/discussions/47
https://github.com/bolo3m2k/rdhslbggtt/discussions/51
https://github.com/zjd6qwwu/xiellftjwv/discussions/48
https://github.com/bolo3m2k/rdhslbggtt/discussions/52
https://github.com/zjd6qwwu/xiellftjwv/discussions/49
https://github.com/tygq5nux/jkgibzxucg/discussions/93
https://github.com/djvb5gwz/kdnyzskenz/discussions/90
https://github.com/tygq5nux/jkgibzxucg/discussions/94
https://github.com/djvb5gwz/kdnyzskenz/discussions/91
https://github.com/tygq5nux/jkgibzxucg/discussions/95
https://github.com/djvb5gwz/kdnyzskenz/discussions/92
https://github.com/tygq5nux/jkgibzxucg/discussions/96
https://github.com/djvb5gwz/kdnyzskenz/discussions/93
https://github.com/tygq5nux/jkgibzxucg/discussions/98
https://github.com/djvb5gwz/kdnyzskenz/discussions/95
https://github.com/djvb5gwz/kdnyzskenz/discussions/96
https://github.com/tygq5nux/jkgibzxucg/discussions/99
https://github.com/tygq5nux/jkgibzxucg/discussions/100
https://github.com/djvb5gwz/kdnyzskenz/discussions/97
https://github.com/tygq5nux/jkgibzxucg/discussions/101
https://github.com/djvb5gwz/kdnyzskenz/discussions/98
https://github.com/djvb5gwz/kdnyzskenz/discussions/99
https://github.com/tygq5nux/jkgibzxucg/discussions/102
https://github.com/djvb5gwz/kdnyzskenz/discussions/100
https://github.com/tygq5nux/jkgibzxucg/discussions/103
https://github.com/djvb5gwz/kdnyzskenz/discussions/101
https://github.com/tygq5nux/jkgibzxucg/discussions/104
https://github.com/tygq5nux/jkgibzxucg/discussions/105
https://github.com/djvb5gwz/kdnyzskenz/discussions/102
https://github.com/tygq5nux/jkgibzxucg/discussions/106
https://github.com/djvb5gwz/kdnyzskenz/discussions/103
https://github.com/tygq5nux/jkgibzxucg/discussions/107
https://github.com/djvb5gwz/kdnyzskenz/discussions/104
https://github.com/tygq5nux/jkgibzxucg/discussions/108
https://github.com/djvb5gwz/kdnyzskenz/discussions/105
https://github.com/tygq5nux/jkgibzxucg/discussions/109
https://github.com/djvb5gwz/kdnyzskenz/discussions/106
https://github.com/tygq5nux/jkgibzxucg/discussions/110
https://github.com/djvb5gwz/kdnyzskenz/discussions/107
https://github.com/tygq5nux/jkgibzxucg/discussions/111
https://github.com/djvb5gwz/kdnyzskenz/discussions/108
https://github.com/tygq5nux/jkgibzxucg/discussions/112
https://github.com/tygq5nux/jkgibzxucg/discussions/113
https://github.com/djvb5gwz/kdnyzskenz/discussions/109
https://github.com/djvb5gwz/kdnyzskenz/discussions/110
https://github.com/tygq5nux/jkgibzxucg/discussions/114
https://github.com/djvb5gwz/kdnyzskenz/discussions/111
https://github.com/tygq5nux/jkgibzxucg/discussions/115
https://github.com/tygq5nux/jkgibzxucg/discussions/116
https://github.com/djvb5gwz/kdnyzskenz/discussions/112
https://github.com/tygq5nux/jkgibzxucg/discussions/117
https://github.com/djvb5gwz/kdnyzskenz/discussions/113
https://github.com/tygq5nux/jkgibzxucg/discussions/118
https://github.com/djvb5gwz/kdnyzskenz/discussions/114
https://github.com/djvb5gwz/kdnyzskenz/discussions/115
https://github.com/tygq5nux/jkgibzxucg/discussions/119
https://github.com/tygq5nux/jkgibzxucg/discussions/120
https://github.com/djvb5gwz/kdnyzskenz/discussions/116
https://github.com/djvb5gwz/kdnyzskenz/discussions/117
https://github.com/bolo3m2k/rdhslbggtt/discussions/53
https://github.com/bolo3m2k/rdhslbggtt/discussions/54
https://github.com/zjd6qwwu/xiellftjwv/discussions/50
https://github.com/bolo3m2k/rdhslbggtt/discussions/55
https://github.com/zjd6qwwu/xiellftjwv/discussions/51
https://github.com/bolo3m2k/rdhslbggtt/discussions/56
https://github.com/zjd6qwwu/xiellftjwv/discussions/52
https://github.com/bolo3m2k/rdhslbggtt/discussions/57
https://github.com/zjd6qwwu/xiellftjwv/discussions/53
https://github.com/zjd6qwwu/xiellftjwv/discussions/54
https://github.com/bolo3m2k/rdhslbggtt/discussions/59
https://github.com/zjd6qwwu/xiellftjwv/discussions/55
https://github.com/bolo3m2k/rdhslbggtt/discussions/60
https://github.com/zjd6qwwu/xiellftjwv/discussions/56
https://github.com/bolo3m2k/rdhslbggtt/discussions/61
https://github.com/zjd6qwwu/xiellftjwv/discussions/57
https://github.com/zjd6qwwu/xiellftjwv/discussions/58
https://github.com/zjd6qwwu/xiellftjwv/discussions/59
https://github.com/bolo3m2k/rdhslbggtt/discussions/62
https://github.com/bolo3m2k/rdhslbggtt/discussions/63
https://github.com/zjd6qwwu/xiellftjwv/discussions/60
https://github.com/bolo3m2k/rdhslbggtt/discussions/64
https://github.com/zjd6qwwu/xiellftjwv/discussions/61
https://github.com/bolo3m2k/rdhslbggtt/discussions/65
https://github.com/tygq5nux/jkgibzxucg/discussions/121
https://github.com/djvb5gwz/kdnyzskenz/discussions/118
https://github.com/tygq5nux/jkgibzxucg/discussions/122
https://github.com/djvb5gwz/kdnyzskenz/discussions/119
https://github.com/tygq5nux/jkgibzxucg/discussions/123
https://github.com/djvb5gwz/kdnyzskenz/discussions/120
https://github.com/tygq5nux/jkgibzxucg/discussions/124
https://github.com/djvb5gwz/kdnyzskenz/discussions/121
https://github.com/tygq5nux/jkgibzxucg/discussions/125
https://github.com/djvb5gwz/kdnyzskenz/discussions/122
https://github.com/tygq5nux/jkgibzxucg/discussions/126
https://github.com/djvb5gwz/kdnyzskenz/discussions/124
https://github.com/djvb5gwz/kdnyzskenz/discussions/125
https://github.com/tygq5nux/jkgibzxucg/discussions/128
https://github.com/tygq5nux/jkgibzxucg/discussions/129
https://github.com/djvb5gwz/kdnyzskenz/discussions/126
https://github.com/tygq5nux/jkgibzxucg/discussions/130
https://github.com/djvb5gwz/kdnyzskenz/discussions/127
https://github.com/tygq5nux/jkgibzxucg/discussions/131
https://github.com/djvb5gwz/kdnyzskenz/discussions/128
https://github.com/djvb5gwz/kdnyzskenz/discussions/129
https://github.com/tygq5nux/jkgibzxucg/discussions/132
https://github.com/djvb5gwz/kdnyzskenz/discussions/130
https://github.com/tygq5nux/jkgibzxucg/discussions/133
https://github.com/djvb5gwz/kdnyzskenz/discussions/131
https://github.com/tygq5nux/jkgibzxucg/discussions/134
https://github.com/djvb5gwz/kdnyzskenz/discussions/132
https://github.com/tygq5nux/jkgibzxucg/discussions/135
https://github.com/djvb5gwz/kdnyzskenz/discussions/133
https://github.com/tygq5nux/jkgibzxucg/discussions/136
https://github.com/djvb5gwz/kdnyzskenz/discussions/134
https://github.com/djvb5gwz/kdnyzskenz/discussions/135
https://github.com/tygq5nux/jkgibzxucg/discussions/137
https://github.com/tygq5nux/jkgibzxucg/discussions/138
https://github.com/djvb5gwz/kdnyzskenz/discussions/136
https://github.com/tygq5nux/jkgibzxucg/discussions/139
https://github.com/djvb5gwz/kdnyzskenz/discussions/137
https://github.com/tygq5nux/jkgibzxucg/discussions/140
https://github.com/djvb5gwz/kdnyzskenz/discussions/138
https://github.com/tygq5nux/jkgibzxucg/discussions/141
https://github.com/djvb5gwz/kdnyzskenz/discussions/139
https://github.com/tygq5nux/jkgibzxucg/discussions/142
https://github.com/djvb5gwz/kdnyzskenz/discussions/140
https://github.com/tygq5nux/jkgibzxucg/discussions/143
https://github.com/tygq5nux/jkgibzxucg/discussions/144
https://github.com/djvb5gwz/kdnyzskenz/discussions/141
https://github.com/tygq5nux/jkgibzxucg/discussions/145
https://github.com/djvb5gwz/kdnyzskenz/discussions/142
https://github.com/tygq5nux/jkgibzxucg/discussions/146
https://github.com/djvb5gwz/kdnyzskenz/discussions/143
https://github.com/djvb5gwz/kdnyzskenz/discussions/144
https://github.com/tygq5nux/jkgibzxucg/discussions/147
https://github.com/tygq5nux/jkgibzxucg/discussions/148
https://github.com/djvb5gwz/kdnyzskenz/discussions/145
https://github.com/djvb5gwz/kdnyzskenz/discussions/146
https://github.com/tygq5nux/jkgibzxucg/discussions/149
https://github.com/tygq5nux/jkgibzxucg/discussions/150
https://github.com/djvb5gwz/kdnyzskenz/discussions/147
https://github.com/djvb5gwz/kdnyzskenz/discussions/148
https://github.com/tygq5nux/jkgibzxucg/discussions/151
https://github.com/djvb5gwz/kdnyzskenz/discussions/149
https://github.com/tygq5nux/jkgibzxucg/discussions/152
https://github.com/djvb5gwz/kdnyzskenz/discussions/150
https://github.com/tygq5nux/jkgibzxucg/discussions/153
https://github.com/tygq5nux/jkgibzxucg/discussions/154
https://github.com/djvb5gwz/kdnyzskenz/discussions/151
https://github.com/djvb5gwz/kdnyzskenz/discussions/152
https://github.com/tygq5nux/jkgibzxucg/discussions/155
https://github.com/djvb5gwz/kdnyzskenz/discussions/153
https://github.com/tygq5nux/jkgibzxucg/discussions/156
https://github.com/tygq5nux/jkgibzxucg/discussions/157
https://github.com/djvb5gwz/kdnyzskenz/discussions/154
https://github.com/tygq5nux/jkgibzxucg/discussions/158
https://github.com/djvb5gwz/kdnyzskenz/discussions/155
https://github.com/djvb5gwz/kdnyzskenz/discussions/156
https://github.com/tygq5nux/jkgibzxucg/discussions/159
https://github.com/djvb5gwz/kdnyzskenz/discussions/157
https://github.com/tygq5nux/jkgibzxucg/discussions/160
https://github.com/djvb5gwz/kdnyzskenz/discussions/158
https://github.com/tygq5nux/jkgibzxucg/discussions/161
https://github.com/djvb5gwz/kdnyzskenz/discussions/159
https://github.com/tygq5nux/jkgibzxucg/discussions/162
https://github.com/djvb5gwz/kdnyzskenz/discussions/160
https://github.com/tygq5nux/jkgibzxucg/discussions/163
https://github.com/djvb5gwz/kdnyzskenz/discussions/161
https://github.com/tygq5nux/jkgibzxucg/discussions/164
https://github.com/djvb5gwz/kdnyzskenz/discussions/162
https://github.com/tygq5nux/jkgibzxucg/discussions/165
https://github.com/djvb5gwz/kdnyzskenz/discussions/163
https://github.com/tygq5nux/jkgibzxucg/discussions/166
https://github.com/zjd6qwwu/xiellftjwv/discussions/62
https://github.com/bolo3m2k/rdhslbggtt/discussions/66
https://github.com/zjd6qwwu/xiellftjwv/discussions/63
https://github.com/bolo3m2k/rdhslbggtt/discussions/67
https://github.com/zjd6qwwu/xiellftjwv/discussions/64
https://github.com/bolo3m2k/rdhslbggtt/discussions/68
https://github.com/zjd6qwwu/xiellftjwv/discussions/65
https://github.com/bolo3m2k/rdhslbggtt/discussions/69
https://github.com/zjd6qwwu/xiellftjwv/discussions/66
https://github.com/bolo3m2k/rdhslbggtt/discussions/70
https://github.com/zjd6qwwu/xiellftjwv/discussions/67
https://github.com/bolo3m2k/rdhslbggtt/discussions/71
https://github.com/bolo3m2k/rdhslbggtt/discussions/72
https://github.com/zjd6qwwu/xiellftjwv/discussions/68
https://github.com/bolo3m2k/rdhslbggtt/discussions/73
https://github.com/zjd6qwwu/xiellftjwv/discussions/69
https://github.com/bolo3m2k/rdhslbggtt/discussions/74
https://github.com/zjd6qwwu/xiellftjwv/discussions/70
https://github.com/bolo3m2k/rdhslbggtt/discussions/75
https://github.com/zjd6qwwu/xiellftjwv/discussions/71
https://github.com/bolo3m2k/rdhslbggtt/discussions/76
https://github.com/zjd6qwwu/xiellftjwv/discussions/72
https://github.com/bolo3m2k/rdhslbggtt/discussions/77
https://github.com/zjd6qwwu/xiellftjwv/discussions/73
https://github.com/bolo3m2k/rdhslbggtt/discussions/78
https://github.com/zjd6qwwu/xiellftjwv/discussions/74
https://github.com/bolo3m2k/rdhslbggtt/discussions/79
https://github.com/zjd6qwwu/xiellftjwv/discussions/75
https://github.com/bolo3m2k/rdhslbggtt/discussions/80
https://github.com/zjd6qwwu/xiellftjwv/discussions/76
https://github.com/bolo3m2k/rdhslbggtt/discussions/81
https://github.com/bolo3m2k/rdhslbggtt/discussions/82
https://github.com/zjd6qwwu/xiellftjwv/discussions/77
https://github.com/bolo3m2k/rdhslbggtt/discussions/83
https://github.com/zjd6qwwu/xiellftjwv/discussions/78
https://github.com/bolo3m2k/rdhslbggtt/discussions/84
https://github.com/zjd6qwwu/xiellftjwv/discussions/79
https://github.com/bolo3m2k/rdhslbggtt/discussions/85
https://github.com/zjd6qwwu/xiellftjwv/discussions/80
https://github.com/bolo3m2k/rdhslbggtt/discussions/86
https://github.com/zjd6qwwu/xiellftjwv/discussions/81
https://github.com/bolo3m2k/rdhslbggtt/discussions/87
https://github.com/zjd6qwwu/xiellftjwv/discussions/82
https://github.com/bolo3m2k/rdhslbggtt/discussions/88
https://github.com/zjd6qwwu/xiellftjwv/discussions/83
https://github.com/zjd6qwwu/xiellftjwv/discussions/84
https://github.com/bolo3m2k/rdhslbggtt/discussions/89
https://github.com/zjd6qwwu/xiellftjwv/discussions/85
https://github.com/bolo3m2k/rdhslbggtt/discussions/90
https://github.com/zjd6qwwu/xiellftjwv/discussions/86
https://github.com/zjd6qwwu/xiellftjwv/discussions/87
https://github.com/bolo3m2k/rdhslbggtt/discussions/91
https://github.com/zjd6qwwu/xiellftjwv/discussions/88
https://github.com/bolo3m2k/rdhslbggtt/discussions/92
https://github.com/7jxumfpc/bssvddkhcx/discussions/12
https://github.com/qyf0xklw/donhtmaxdf/discussions/11
https://github.com/7jxumfpc/bssvddkhcx/discussions/13
https://github.com/7jxumfpc/bssvddkhcx/discussions/14
https://github.com/qyf0xklw/donhtmaxdf/discussions/12
https://github.com/7jxumfpc/bssvddkhcx/discussions/15
https://github.com/7jxumfpc/bssvddkhcx/discussions/16
https://github.com/qyf0xklw/donhtmaxdf/discussions/13
https://github.com/7jxumfpc/mgmiqswogs/discussions/1
https://github.com/qyf0xklw/txdfvjrbzp/discussions/1
https://github.com/qyf0xklw/txdfvjrbzp/discussions/2
https://github.com/qyf0xklw/txdfvjrbzp/discussions/3
https://github.com/qyf0xklw/txdfvjrbzp/discussions/4
https://github.com/qyf0xklw/txdfvjrbzp/discussions/5
https://github.com/7jxumfpc/mgmiqswogs/discussions/2
https://github.com/qyf0xklw/txdfvjrbzp/discussions/6
https://github.com/7jxumfpc/mgmiqswogs/discussions/3
https://github.com/qyf0xklw/txdfvjrbzp/discussions/7

Copy
//转换对象为某一种类型
public static T ConvertTo(object value)
{
return (T)Convert.ChangeType(value, typeof(T));
}
如果是限定的几种类型,可以使用switch语句进行判断,并将对象转成T,以进行类型安全的操作。如果不是的话,推荐使用接口来定义类的通用行为,这个回答中提供了一些建议,推荐看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值