c# – 将对象隐式转换为字符串,以便在Hashtable中使用

前端之家收集整理的这篇文章主要介绍了c# – 将对象隐式转换为字符串,以便在Hashtable中使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我们有这个课程:
  1. public class Moo
  2. {
  3. string _value;
  4.  
  5. public Moo(string value)
  6. {
  7. this._value = value;
  8. }
  9.  
  10. public static implicit operator string(Moo x)
  11. {
  12. return x._value;
  13. }
  14.  
  15. public static implicit operator Moo(string x)
  16. {
  17. return new Moo(x);
  18. }
  19.  
  20. public override bool Equals(object obj)
  21. {
  22. if (obj is string)
  23. return this._value == obj.ToString();
  24. else if (obj is Moo)
  25. return this._value == ((Moo)obj)._value;
  26. return base.Equals(obj);
  27. }
  28.  
  29. public override int GetHashCode()
  30. {
  31. return _value.GetHashCode();
  32. }
  33. }

如果我将这种类型的对象添加到Hashtable,那么我可以使用相同的字符串找到该对象.
但是如果Hashtable包含字符串而不是对象,则在传递对象时无法找到它.

  1. Moo moo = new Moo("abc");
  2. bool result1 = moo == "abc"; //true
  3. bool result1a = moo.Equals("abc"); //true
  4. bool result2 = "abc" == moo; //true
  5. bool result2a = "abc".Equals(moo); //true
  6. bool result2b = ((object)"abc").Equals(moo); //false
  7.  
  8. Hashtable hash = new Hashtable();
  9. hash[moo] = 100;
  10. object result3 = hash[moo]; //100
  11. object result4 = hash["abc"]; //100
  12.  
  13. hash = new Hashtable();
  14. hash["abc"] = 100;
  15. object result5 = hash[moo]; //null!!!!
  16. object result6 = hash["abc"]; //100

我已经尝试重写operator ==并且它没有任何区别.
是否可以通过这种方式在Hashtable中使用隐式转换?

解决方法

首先,为什么使用哈希表而不是通用词典<,>?

无论如何,你的问题是哈希表调用((object)“abc”).当然,等于(moo),返回false.您可以通过使用IEqualityComparer参数将自己的IEqualityComparer实现传递给其中一个HashTable构造函数来覆盖该行为.

正如您所指出的那样,您正试图避免修改遗留代码,因此您可能无法将现有哈希表替换为具有自定义IEqualityComparer的哈希表.如果这是真的,那么我认为答案是你不能做你想做的事.

既然你正在开发这个“moo”类,我想你可以控制将moo类传递给哈希表的索引器的代码.如果这是真的,你可以在你传递给索引器的对象上调用ToString(),当然,在Moo中覆盖ToString.

猜你在找的C#相关文章