我正在尝试从哈希表中检索一个布尔值...我的代码看起来像这样:
Hashtable h = new Hastable();
...
h["foo"] = true;
...
object o = h["foo"];
if( o == null ) { return false; }
if( o.GetType() != typeof(bool) ) { return false; }
return (bool)o;
相比之下,我对对象使用这样的东西
return h["foo"] as MyObject;
布尔有没有更好的解决方案?
答案 0 :(得分:6)
好吧,如果必须使用Hashtable (或出于其他原因键入数据object
),请考虑:
object obj = true;
bool b = (obj as bool?) ?? false;
// b -> true
和
object obj = "hello";
bool b = (obj as bool?) ?? false;
// b -> false
也就是说,bool?
(或Nullable<bool>
)很高兴成为as
目标(因为null
是可空类型的有效值)并且结果很容易合并(??
)到bool
。
快乐的编码。
答案 1 :(得分:2)
不要使用Hashtables。自.NET 2.0问世以来,已经淘汰了七年。请改用通用集合,例如Dictionary
。
Dictionary<string, bool> myDict = new Dictionary<string, bool>();
myDict["foo"] = true;
bool myBool = myDict["foo"];
泛型非常精彩。帮自己一个忙,花几个小时研究它们。你可以开始here, with MSDN,我非常喜欢Jon Skeet的书,C# in Depth,它深入探讨了这个主题。
答案 2 :(得分:2)
您可以使用扩展方法来帮助使工作更具可忍性:
public static class IDictionaryExtensions
{
public static T? GetValue<T>(this IDictionary dictionary, object key)
where T : struct
{
if (!dictionary.Contains(key))
return null;
object o = dictionary[key];
if (o == null)
return null;
if (!(o is T))
return null;
return (T) o;
}
public static T GetValue<T>(this IDictionary dictionary, object key,
T defaultValue) where T : struct
{
return dictionary.GetValue<T>(key) ?? defaultValue;
}
}
用作:
return h.GetValue("foo", false);
您可以轻松地将其修改为在正确的位置转换异常,或者记录缺失值或类型不匹配。
答案 3 :(得分:1)
您应该使用通用
Dictionary<string, bool>
而不是(过时的)Hashtable。
答案 4 :(得分:0)
bool bVal = false;
object oVal;
if (hash.TryGetValue("foo", out oVal)) {
bVal = (bool) oVal;
}