使类型表现得像“对象”类型一样?

时间:2018-08-08 02:01:28

标签: c# oop types casting polymorphism

我正在尝试创建一种可以单独用作列表或字典或值的类型。
定义:

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);

1 个答案:

答案 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访问是不安全的,因此限制了其访问。