【问题标题】:Make a type behave like an 'object' type?使类型表现得像“对象”类型?
【发布时间】:2018-08-08 02:01:28
【问题描述】:

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

public Dictionary<string, object> data = new Dictionary<string, object>();

我正在尝试寻找 object 类型的替代方法,该类型在此处用作字典值类型。
我这里的值类型是对象,因为我可以放任何我想要的。
但是当我把它拿出来时,我希望能够将它转换为 List&lt;object&gt;Dictionary&lt;string, object&gt; 并进行空值检查以获得实际值。

访问:

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&lt;string, ISerializable&gt;();,因为它不支持原始值类型。
例如:我不能执行以下操作

Dictionary<string, ISerializable> data = new Dictionary<string, ISerializable>();
data.Add("aa", 42);

【问题讨论】:

  • “我希望能够在那里使用 ISerializable 尊重类。” 那么为什么不使用Dictionary&lt;string, ISerializable&gt;
  • 那么你现在遇到了什么问题?
  • 我现在的问题是我无法确定字典中的值是否可序列化。

标签: c# oop types casting polymorphism


【解决方案1】:

在考虑了更多之后,我编写了一个包装类,只是为了区分值类型和 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 访问不安全,因此限制了其访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2021-02-02
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多