我正在尝试创建一种可以单独用作列表或字典或值的类型。
定义:
public Dictionary<string, object> data = new Dictionary<string, object>();
我正在尝试找到object
类型的替代方法,在这里用作字典值类型。
我在这里拥有的值类型是对象,因为我可以放入任何想要的东西。
但是,当我将其取出时,我希望能够将其转换为List<object>
或Dictionary<string, object>
并进行空检查以获取实际值。
访问权限:
foreach (string k in data.Keys)
ParseValue(data[k], new TextWriter());
...
private void ParseValue(object value, TextWriter writer)
{
var valList = value as List<object>;
var valDict = value as Dictionary<string, object>;
if (valList != null)
valList.ForEach(v => ParseValue(v, writer));
else if (valDict != null)
valDict.Keys.ForEach(k => ParseValue(valDict[k], writer));
else writer.WriteValue(value);
}
如果可行,那么我可以遍历字典中的值并递归,它为我提供了一个非常灵活的嵌套类型(类似于JSON)。
对象的实例还保存有用的值。
我希望在那里可以使用一个ISerializable
尊敬的班级。
我的项目使用C#,但如果可能的话,它应该适用于我认为的任何严格类型的语言。
编辑:
我不能使用new Dictionary<string, ISerializable>();
,因为它不支持原始值类型。
例如:我不能执行以下操作
Dictionary<string, ISerializable> data = new Dictionary<string, ISerializable>();
data.Add("aa", 42);
答案 0 :(得分:0)
再想一想之后,我写了一个包装器类,只是为了捕捉值类型和ISerializable之间的区别。
class MySerializable
{
public Type type { get { return _type; } }
private Type _type = null;
private object o;
private ISerializable s;
public MySerializable(object obj)
{
_type = o.GetType();
ISerializable ss = obj as ISerializable;
if (ss != null) s = ss;
else if (_type.IsPrimitive)
{
o = obj;
}
else
{
throw new Exception("Can only use value types or ISerializables.");
}
}
public override string ToString()
{
if (o != null) return o.ToString();
else
{
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, s);
return Convert.ToBase64String(ms.ToArray());
}
}
}
}
我认为这可以解决问题,但我对此并不满意。
希望知道是否有人对此有更好的想法/改进。
编辑:正如某人在reddit上指出的那样,公共type
访问是不安全的,因此限制了其访问。