今天,同事发了个邮件说需要一个内部使用的GUID类,而不是System.Guid 结构体。什么意思呢?
例如public void Test(string guidPara) 这个方法的参数是个string类型,但是是通过参数名称告诉调用者是Guid类型的参数,因此,他需要的应该是:
public void Test(GUID para), 参数类型这么修改后,所有调用的地方需要统一改一遍,这不很恶。所以,实现了自定义的GUID类:
1 public class GUID 2 { 3 #region 构造函数 4 5 /// <summary> 6 /// 构造函数 7 /// </summary> 8 public GUID() { } 9 10 /// <summary> 11 /// 构造函数 12 /// </summary> 13 /// <param name="guid">Guid</param> 14 public GUID(string guid) 15 { 16 Value = guid; 17 } 18 19 /// <summary> 20 /// 构造函数 21 /// </summary> 22 /// <param name="guid">Guid</param> 23 /// <returns></returns> 24 public static implicit operator GUID(string guid) 25 { 26 return new GUID(guid); 27 } 28 29 #endregion 30 31 #region 属性 32 33 private string guidValue; 34 35 /// <summary> 36 /// Guid 37 /// </summary> 38 public string Value 39 { 40 get 41 { 42 if (string.IsNullOrWhiteSpace(guidValue)) 43 guidValue = Guid.NewGuid().ToString(); 44 45 return guidValue; 46 } 47 private set 48 { 49 guidValue = value; 50 } 51 } 52 53 #endregion 54 55 /// <summary> 56 /// 重载ToString方法 57 /// </summary> 58 /// <returns>Value</returns> 59 public override string ToString() 60 { 61 return guidValue; 62 } 63 }
单元测试下:
1 [TestMethod] 2 public void GUIDTest1() 3 { 4 var guid = new GUID("97b7e1ab-db31-4679-8a3c-59f0101c7497"); 5 Assert.AreEqual("97b7e1ab-db31-4679-8a3c-59f0101c7497", guid.Value); 6 } 7 8 [TestMethod] 9 public void GUIDTest2() 10 { 11 GUID guid = "97b7e1ab-db31-4679-8a3c-59f0101c7497"; 12 Assert.AreEqual("97b7e1ab-db31-4679-8a3c-59f0101c7497", guid.Value); 13 } 14 15 [TestMethod] 16 public void GUIDTest3() 17 { 18 var guidValue = GetGuidValue("97b7e1ab-db31-4679-8a3c-59f0101c7497"); 19 Assert.AreEqual("97b7e1ab-db31-4679-8a3c-59f0101c7497", guidValue); 20 } 21 22 private string GetGuidValue(GUID guid) 23 { 24 return guid.Value; 25 }
自然好了很多,已有程序不需要进行修改,GUID在整个运行时也进行了强类型处理,有以下几个特点:
1.GUID强类型
2.GUID实例缓存了Value成员,new 操作自动生成Guid。
3.string类型隐式转换
请大家看看需要其他的改进吗?