C#处理值可能(或可能不是)数组的字典

时间:2014-03-19 14:21:10

标签: c# arrays object dictionary collections

我正在创建一个库,它将JSON对象解码为c#对象,然后我们的用户可以访问,修改和重新发送。一些对象是预先确定的,其他对象最终将是非预定的(尽管它们确实有几种标准的可能格式)。因此,我们发现管理这些值的最佳方法是创建一个带有字典的对象。

Dictionary<string, Field> _fields = new Dictionary<string,Field>;

然后我们所有的对象都可以是字段,我们为已建立的对象创建属性,以及索引器/方法来获取包括非预定对象的任何字段。

public OurObject : Field

public T GetFieldByName<T>(string fieldName) where T : class
        {
            return _fields.ContainsKey(fieldName) ? _fields[fieldName] as T: null;
        }

public Field this[string index]
    {
        get { return _fields.GetFieldByName<Field>(index); }
        set { _fields.SetFieldByName(index, value); }
    }

好的很酷。但后来我意识到其中一些对象实际上是数组。该死的。好的,所以回到绘图板。但是我们在寻找处理这些Array / Not Arrays的通用访问/管理的好方法时遇到了一些麻烦。

到目前为止,我们提出的想法包括:

  • 创建从字段扩展并将其放入(FieldCollection)的集合对象,从中扩展任何数组的字段对象。
  • 将字典中的字段更改为Field [],并可能将字段添加到字段“IsArray”(可能与前一点一起)

有没有更好的方法来保持散列以保持单个对象或对象数组的方式相同?这将是一个库,因此我们希望它对用户来说尽可能简单易用。

1 个答案:

答案 0 :(得分:0)

首先,查看JSON.Net。它将为您处理序列化/反序列化原始类型和字典等。它还将处理自定义数据类型。

例如,来自文档(http://james.newtonking.com/json/help/index.html

您期望的类型

public class Account
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public IList<string> Roles { get; set; }
}

数据

string json = @"{
'Email': 'james@example.com',
'Active': true,
'CreatedDate': '2013-01-20T00:00:00Z',
'Roles': [
    'User',
    'Admin'
    ]
}";

反序列化并访问字典,正如您所期望的那样

Account account = JsonConvert.DeserializeObject<Account>(json);
Console.WriteLine(account.Email);