【问题标题】:Unity: switch based on value type in Dictionary<string, object>?Unity:基于 Dictionary<string, object> 中的值类型切换?
【发布时间】:2019-10-26 07:59:17
【问题描述】:

我进行了大量研究,但似乎找不到适合我的答案。我有一个字典,其中包含我所有的全局游戏变量/状态的值(例如拾取的库存物品等),它的设置类似于Dictionary&lt;string, object&gt;,因为某些变量是布尔值,而其他变量是字符串、整数等。

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

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

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

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

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • GlobalGameVars 是如何存储的? Unity 的序列化引擎并不总是能很好地处理混合数据类型。
  • 现在我只是将它作为一个公共静态字典。当我开始保存时,我计划遍历它并序列化每个值。

标签: c# unity3d types


【解决方案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&lt;string, IGameValue&gt;,其中IGameValue 是您定义的接口。该接口的每个实现(比如BooleanGameValue)都会有它需要的任意信息,但也总是会在游戏循环代码中公开你需要的信息。

【讨论】:

  • 你认为这与从列表而不是字典中读取有什么关系吗?我对 C# 相当陌生,但字典有时似乎很奇怪。当您使用 IGameValue 时,我假设您的意思是自定义(由我创建)数据类型/类来保存实际值和数据类型?
  • 字典也可以正常工作。你的确切错误信息是什么?是的,您将创建一个接口 IGameValue,然后在一个类中实现该接口(例如:类 GameString : IGameValue)。有关详细信息,请参阅docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • 感谢您的回复。我一直在从事其他项目,但是当我有时间时,我一直在研究接口,因为我对它们一无所知。经过研究,我的一个问题是:在这种情况下,为什么要使用接口而不是抽象类?既然两者都可以继承,那么两者都可以工作,对吧?我不知道的接口有什么好处吗?
  • 所以我做了一些测试,我发现虽然GlobalGameVars.globals[key].GetType() == typeof(bool) 不起作用,但它确实起作用了GlobalGameVars.globals[key] is bool 不知道为什么一个会起作用而另一个不起作用,但也许那会帮助别人。界面建议非常好。这种情况似乎没有必要,因为我能够让它像上面那样工作,但我可以看到它在更复杂的场景中如何非常有用。
  • 当你有一些应该共享的基本功能时使用抽象类,而接口是一个契约,声明实现它的类将提供该功能。接口还允许多重继承;抽象类没有。当您开始使用依赖注入和单元测试时,接口也很有用。更多详情请看这里:stackoverflow.com/questions/13442312/…
猜你喜欢
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多