在项目中可能经常遇到不同类型之间的转换, 如 int转换为byte double转换为int。
那么这些显式或隐式转换是如何实现的呢,下面也是以User对象举例。
首先贴上来User.cs的所有属性
/// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 持有金额 /// </summary> public int Money { get; set; }
需求实现如下代码的可用性:
User u1 = 5; //int隐式转换为User User u2 = "王旭"; //string隐式转换为User int money = (int)user; //User显式转换为int string name = (string)user; //User显式转换为string
--------------------------------------------
解释完需求后,下面是咱们的实现代码了:
在User.cs中:
#region 类型转换构造函数 //构造一个由int类型隐式构造并返回一个User public static implicit operator User(int money) { return new User() { Money = money }; } //构造一个由string类型隐式构造并返回一个User public static implicit operator User(string userName) { return new User() { Name = userName }; } //由一个User对象显式返回一个int public static explicit operator int(User user) { return user.Money; } //由一个User对象显式返回一个string public static explicit operator string(User user) { return user.Name; } #endregion
关于以上代码的说明:
对于转换操作符方法,编译器即可生成代码来隐式调用一个转换操作符方法,也可只有在源代码进行了显式转型时,才生成代码来调用一个转换操作符方法。在C#中,implicit 关键字告诉编译器为了生成代码来调用方法,不需要在源代码中进行显式转型。相反,explicit 关键字告诉编译器只有在发现了显式转型时,才调用方法。
在implicit 或 explicit 关键字之后,要指定 operator 关键字告诉编译器该方法是一个转换操作符。在 operator 之后,指定对象要转换成什么类型。在圆括号内,则指定要从什么类型转换。
以上实现了我们的需求了,下面贴下Main方法,以及Demo的完整例子项目下载:
using System; using System.Collections.Generic; using System.Text; namespace ConvertDemo { class Program { static void Main(string[] args) { //构造一个User对象 User user = new User(); user.Name = "Andrew"; user.Money = 100; //依次测试咱们写的隐式、显式转换吧 User u1 = 5; //int隐式转换为User User u2 = "王旭"; //string隐式转换为User int money = (int)user; //User显式转换为int string name = (string)user; //User显式转换为string //以上代码测试了咱们写的4个转换方法,下面打印出来看看吧。~ Console.WriteLine("u1:" + u1.Name + "," + u1.Money); Console.WriteLine("u2:" + u2.Name + "," + u2.Money); Console.WriteLine("money:" + money); Console.WriteLine("name:" + name); Console.ReadLine(); } } }
完整Demo项目下载:http://files.cnblogs.com/andrew-blog/ConvertDemo.rar