如何从哈希表对象获取字段

本文关键字:获取 字段 对象 哈希表 | 更新日期: 2023-09-27 17:56:22

我在这里有一个问题,无法从 hastable 对象获取字段。 这是我拥有的:

我有一个 Unity C# 函数

void completionHandler( string error, object result )
{
    debug.log(result.GetType); // the type of result is System.Collections.Hastable 
}   

无论如何都可以从结果中获取字段;我尝试过的:

  1. 什么都没显示

    FieldInfo[] fields = result.GetType().GetFields();
    foreach (FieldInfo fieldInfo in fields)
    {
      Debug.Log("Obj, Field: " + fieldInfo.Name);
    }
    
  2. 也没有显示任何东西:

    Hashtable resultHash = result.toHashtable();
    foreach (string keys in resultHash.Keys)
    {
      Debug.Log("Obj, keys: " + keys);
    }
    

如何从哈希表对象获取字段

很难理解所问的问题。下面是一段代码,用于解释您提供的代码片段:

using System;
using System.Collections;
using System.Reflection;
namespace SO14577299
{
    class Program
    {
        static void Main()
        {
            object result = new Hashtable();
            //Trying to get public fields via reflection:
            //there are no public fields on this class
            FieldInfo[] fields = result.GetType().GetFields();
            foreach (FieldInfo fieldInfo in fields)
            {
                Console.WriteLine("Obj, Field: " + fieldInfo.Name);
            }
            Console.WriteLine("->1");
            Hashtable resultHash = result as Hashtable;
            //Trying to list all the keys
            //this is an empty collection, nothing there
            foreach (string keys in resultHash.Keys)
            {
                Console.WriteLine("Obj, keys: " + keys);
            }
            Console.WriteLine("->2");
            resultHash = new Hashtable();
            resultHash["a"] = "1";
            resultHash["b"] = "2";
            //Trying to list all the keys
            //Now there are two: a and b
            foreach (string keys in resultHash.Keys)
            {
                Console.WriteLine("Obj, keys: " + keys);
            }
            Console.WriteLine("->3");
        }
    }
}

下面是此代码的输出:

->1
->2
Obj, keys: a
Obj, keys: b
->3

第一个输出为空,因为您正在尝试枚举 Hashtable 类的公共字段:没有。

第二个输出为空,仅仅是因为哈希表为空。第三个输出演示如果输出不为空,则打印的内容。

可以尝试通过

尝试输出计数来调试代码:

foreach (string keys in resultHash.Keys)
{
  Debug.Log("Count: " + resultHash.Count.ToString());
}

通过这种方式,您可以证明/反驳您的哈希表是空的。

另外请检查toHashtable方法。这不是标准方法,并且从您的示例中无法说明它可能做什么。它可以做一些与人们期望的非常不同的事情。如果您知道该对象是哈希表类型,则Hashtable resultHash = result as Hashtable是一个更安全的选择

如果要将对象转换为Hashtable然后解析它,可以尝试以下操作:

void completionHandler(string error, object result)
{
    var hashTable = result as Hashtable;
    if (hashTable != null)
    {
        foreach (object key in hashTable.Keys)
        {
            Debug.Write(
                String.Format("key:{0} value:{1}", 
                    key.ToString(), 
                    hashTable[key]));
        }
    }
}