1

我一直在做很多研究,但似乎找不到适合我的答案。我有一个字典,其中包含我所有的全局游戏变量/状态的值(例如拾取的库存物品等),它的设置就像Dictionary<string, object>因为某些变量是布尔值,而其他变量是字符串、整数等。

我的问题是:在遍历字典时,如何区分它们以确定哪个是布尔值、字符串等?我试过类似的东西:

foreach (string key in GlobalGameVars.globals.Keys.ToList())
{
      if (GlobalGameVars.globals[key].GetType() == typeof(bool))
            // Do something
}

不幸的是,它告诉我对象类型和布尔类型不匹配。这是有道理的,但是有没有办法使用一个对象然后测试它的底层类型?

或者有没有更好的方法可以让我放弃使用通用对象类型?

任何帮助将非常感激。谢谢!

4

1 回答 1

1

这个逻辑应该有效。例如,这在 linqpad 中运行良好:

var foo = new List<object>();

foo.Add("123");
foo.Add(123);
foo.Add(false);

foreach (var thing in foo)
{
    if (thing.GetType() == typeof(bool))
    {
        "I found a bool".Dump();
    }
    else
    {
        "Not a bool".Dump();
    }
}

运行它,你会得到:

Not a bool
Not a bool
I found a bool

但是要回答您的问题,您最好创建一个您定义的接口Dictionary<string, IGameValue>在哪里。IGameValue该接口的每个实现(比如BooleanGameValue)都会有它需要的任意信息,但也总是会在游戏循环代码中公开您需要的信息。

于 2019-06-11T21:08:44.240 回答