从对象字典中获取对象

时间:2012-11-06 18:12:47

标签: c# object dictionary boxing

我正在尝试从对象字典中提取对象,然后返回所述对象,但是我对类型有点问题。有问题的类看起来像这样,我想知道如何返回实际对象而不是变量(我假设默认情况下是一个字符串)。

 public Object GetObject(string foo){

 if(someDict.ContainsKey(foo))
 {
   var pulledObject = someDict[foo];

 }
  return pulledObject;
 }

我原本以为需要拳击,比如

 object pulledObject = someDict[foo];

但这似乎不起作用,任何可以指出我正确方向的建议。

3 个答案:

答案 0 :(得分:8)

你并没有真正说出什么不起作用,但你走在正确的轨道上。尝试这样的事情:

public Object GetObject(string foo){

  if (someDict.ContainsKey(foo))
    return someDict[foo];
  return null;
}

我怀疑您的问题是您在pulledObject处获得了编译错误,该错误位于子范围内。

更新:正如Jon Skeet指出的那样,使用TryGetValue会更好,所以你不要执行两次查询(一次执行ContainsKey时,再次使用indexer []时)。所以,更好的解决方案是:

public Object GetObject(string foo){

  object pulledObject = null;
  someDict.TryGetValue(foo, out pulledObject);
  return pulledObject;
}

答案 1 :(得分:2)

假设代码准确无误,则存在范围问题。你在if语句的范围内声明了你的pullObject,使得它无法在你的return语句之外访问。

public Object GetObject(string foo)
{
    object pulledObject = null;
    if(someDict.ContainsKey(foo))
    {
        pulledObject = someDict[foo];
    }
    return pulledObject;
}

或(由Jon Skeet提供)

public Object GetObject(string foo)
{
    object pulledObject = null;
    someDict.TryGetValue(foo, out pulledObject);
    return pulledObject;
}

答案 2 :(得分:1)

您的代码不起作用的原因不是pulledObject类型错误,而是因为它超出了范围。你可以这样做:

public Object GetObject(string foo){
    if(someDict.ContainsKey(foo)) {
        return someDict[foo];
    }
    return null;
}

用户可按以下方式致电GetObject

object res = GetObject(foo);
if (res == null) {
    // Object is not there - do something else
}

这种模式的缺点是无法区分对象存在时的情况,但是当对象不在时,情况为null。对.NET的字典API更“原生”的方法是使用TryGetValue而不是GetObject,如下所示:

object res;
if (someDict.TryGetValue(foo, out res)) {
} else {
    // Object is not there - do something else
}

这种方法只执行一次查找操作,从而节省了CPU(尽管坚持使用这种方法进行所谓的速度改进将是微观优化)。