在Directory <system.string,system.object =“”> - C#Unity Dictionary中按键访问值

时间:2017-05-04 20:12:11

标签: c# dictionary firebase unity3d firebase-realtime-database

这段代码会侦听Firebase中的任何更改,并在检测到更改时触发HandleListChange():

void SetRoomListListener()
{
    FirebaseDatabase.DefaultInstance
        .GetReference ("Rooms")
        .ValueChanged += HandleListChange;
}

我的HandleListChange()目前看起来像这样:

void HandleListChange(object sender, ValueChangedEventArgs args)
{
    if (args.DatabaseError != null) {
        Debug.LogError (args.DatabaseError.Message);
        return;
    }

    // We got the new data
    foreach (DataSnapshot room in args.Snapshot.Children) 
    {
        string roomName = room.Key;

        foreach (KeyValuePair<string, Object> info in room.Value) 
        {
            Debug.Log (info);
        }
    }
}

调试room.Key为我提供了我想要的房间名称,room.Value返回了某种字典 - &gt; Dictionary2[System.String, System.Object]。我想使用密钥访问该词典中的值,让我们说room.Value["size"]但是我从foreach循环foreach statement cannot operate on variables of type object because it does not contain a definition for GetEnumerator or is inaccessible得到了这个错误。我已经尝试了很多其他方法,但无法使其发挥作用。这是我第一次使用:目录和firebase,所以我不知道最近发生了什么。适用于Unity的Firebase API非常小,互联网也没什么帮助。我想这个问题更可能发生在C#方面,而不是Unity或Firebase上。如何使用该目录中的密钥访问我的值?感谢。

1 个答案:

答案 0 :(得分:2)

DataSnapshot.Value object似乎room.Value返回var dictionary = (IDictionary<string, object>)room.Value; var exampleValue = dictionary["size"]; ,可能会封装不同的原生类型。

如果您确定select ID = case when( Row_Number() over (partition by id order by id) = 1) then id else null end , Name = case when( row_number() over (partition by id order by id) = 1) then Name else null end , Roles = case when (row_number() over (partition by id, roles order by id) = 1) then Roles else null end , Groups = case when (row_number() over (partition by id, Groups order by id) = 1) then Groups else null end , Profiles from #yourreturnstable 包含字典,那么您应该将其转换为然后像C#中的任何字典一样访问其成员:

brew install boost