来源:https://note.guoqianfan.com/2022/04/22/operator-implicit-explicit-in-csharp/
前言
有时我们会遇到这么一种情况:在json数据里,数组里的数据类型不一致,导致我们不能直接反序列化为目标类型。最终我们只能反序列化为JObject类型,然后通过字符串取值的方式来取出数据。
下面介绍一种新方式:通过自定义隐式转换,把不一样的数据类型反序列化为一样的数据类型。
基础知识
类型转换有2种:隐式转换和显式转换。但是,不管是隐式转换,还是显式转换,都是生成了一个新对象返回的。改变新对象的属性,不会影响老对象!(dynamic对象
除外,详情搜索dynamic动态类型
。)
自定义隐式/显式转换的方法需要用到几个关键字:implicit
(隐式转换)、explicit
(显式转换)、operator(操作符)
。更多的注意点见下:
- 方法必須是static
- 使用
implicit
或explicit
- 搭配
operator
(此也是c#關鍵字,可在類別或結構宣告內多載內建運算子或提供使用者定義的轉換) - 返回值为要转换为的目标类型,但不要在方法上声明,方法名为目标类型。注意:返回值不一定是本类类型。本类型和其他类型之间可以互相转换,只要定义转换方法就行。
- 参数为原始类型,方法名为目标类型
- 类A到类B的类型转换定义不能在类C中进行(即2个类的转换不能在第3个类中定义),否则会报错:
用户定义的转换必须是转换成封闭类型,或者从封闭类型转换
。具体查看后面的用户定义的转换必须是转换成封闭类型,或者从封闭类型转换 - 不能被
virtual
/override
修饰(不能“覆盖”运算符,因为它们是静态的。)Overriding implicit operators in C#
示例代码
//================定义类型和方法================
class Robot
{
public int Id {
get; set; }
public string Name {
get; set; }
public Robot(int id, string name)
{
Id = id;
Name = name;
}
#region 其他类型->本类
//隐式转换
public static implicit operator Robot(string name)
{
return new Robot(101, name);
}
//显式转换
public static explicit operator Robot(int id)
{
return new Rob