我正在尝试从对象字典中提取对象,然后返回所述对象,但是我对类型有点问题。有问题的类看起来像这样,我想知道如何返回实际对象而不是变量(我假设默认情况下是一个字符串)。
public Object GetObject(string foo){
if(someDict.ContainsKey(foo))
{
var pulledObject = someDict[foo];
}
return pulledObject;
}
我原本以为需要拳击,比如
object pulledObject = someDict[foo];
但这似乎不起作用,任何可以指出我正确方向的建议。
答案 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(尽管坚持使用这种方法进行所谓的速度改进将是微观优化)。