c#中__setitem__的等价物是什么

时间:2014-08-26 18:02:36

标签: c# deserialization

我正在使用一个类来反序列化一些字节。 在python中, setitem 的用法如下:

## python code
class xdict(dict):
    def __setitem__(self, key, value):
        if key in self:
            selfval = self[key] # the value already there
            if type(selfval) == list:
                selfval.append(value)
            else:
                super(xdict, self).__setitem__(key, [selfval] + [value])
        else:
            if type(value) == xdict: # convert nested BSON documents (xdicts) to a dictionary
                super(xdict, self).__setitem__(key, value.to_dict())
            else:
                super(xdict, self).__setitem__(key, value)

现在我试图在c#中这样做。 我试过像:

// c# code:
class XDict
{
    private Hashtable table = new Hashtable();

    public XDict(string key, object value)
    {
    // stuff...
    }
}

但是我收到错误" ...与Test.common.XDict类的任何字段或属性都不匹配"

3 个答案:

答案 0 :(得分:2)

更简单的方法是Ben的版本只是扩展字典类本身,而不是在新类中使用字典字段。

public class XDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
    public new TValue this[TKey key] 
    {
        get { return base[key]; }   // get item calling the base implementation
        set 
        { 
               if(value.Equals(default(TValue))) // additional logic (OPTIONAL)
                   return;                       // Don't add default values
               base[key] = value; // set item calling the base implementation 
        }  
    }
}

你会像以下一样使用它:

{
    XDictionary<string, object> xDict = new XDictionary<string,object>();
    xDict["Test"] = 5; // This will call the set { } code above.

    // Be wary though, if you try to do this through another type like this:
    // It will not call your setter code, but but the base implementation
    ((IDictionary<string, object>)xDict)["Test2"] = 6;
}

答案 1 :(得分:0)

通常你会使用字典,但有一个语言功能:

class XDict<TKey, TValue>
{
    private readonly Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>();

    public TValue this[TKey key]
    {
        get { return dict[key]; }
        set { dict[key] = value; }
    }
}

显然,您需要更改类型参数以匹配您的特定用例;这只是自我指数属性的说明。

任何从BSON转换价值的逻辑都留作了读者的谚语。

答案 2 :(得分:0)

我明白了: 良好的旧遗产:

class XDict : Hashtable
{
    public override void Add(object key, object value)
    {
        if (key.Equals("something"))
        {
            // ...
        }
        else
        {
            base.Add(key, value);
        }
    }

}