我正在使用一个类来反序列化一些字节。 在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类的任何字段或属性都不匹配"
答案 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);
}
}
}