繁体   English   中英

用自定义数据类型覆盖ToString

[英]Overriding ToString with a custom data type

在主要我有以下代码:

var json = new JValue { Object = new Dictionary<string, JValue>() };
json["name"] = new JValue("Lebron James");
json["age"] = new JValue(23);

if (json.Type == JType.Object)
{
    foreach (var value in json.Object)
    {
        System.Console.WriteLine(value.ToString());
    }
}

自定义类和数据类型如下:

public enum JType
{
    Null,
    Bool,
    Number,
    String,
    Array,
    Object,
}

public class JValue
{
    public JType Type { get; private set; }
    private JsonValue Value { get; set; }

    public JValue()
    {
        Type = JType.Null;
    }

    public JValue(bool value)
    {
        Type = JType.Bool;
        Value = new JsonBool { Value = value };
    }

    public JValue(double value)
    {
        Type = JType.Number;
        Value = new JsonNumber { Value = value };
    }

    public JValue(string value)
    {
        Type = JType.String;
        Value = new JsonString { Value = value };
    }

    public JValue(List<JValue> values)
    {
        Type = JType.Array;
        Value = new JsonArray { Values = values };
    }

    public JValue(Dictionary<string, JValue> values)
    {
        Type = JType.Object;
        Value = new JsonObject { Values = values };
    }

    public bool Null
    {
        get { return Type == JType.Null; }
        set { Type = JType.Null; Value = null; }
    }

    public bool Bool
    {
        get
        {
            if (Type != JType.Bool) throw new InvalidCastException();
            return ((JsonBool)Value).Value;
        }
        set
        {
            Type = JType.Bool;
            Value = new JsonBool { Value = value };
        }
    }

    public double Number
    {
        get
        {
            if (Type != JType.Number) throw new InvalidCastException();
            return ((JsonNumber)Value).Value;
        }
        set
        {
            Type = JType.Number;
            Value = new JsonNumber { Value = value };
        }
    }

    public string String
    {
        get
        {
            if (Type != JType.String) throw new InvalidCastException();
            return ((JsonString)Value).Value;
        }
    }

    public List<JValue> Array
    {
        get
        {
            if (Type != JType.Array) throw new InvalidCastException();
            return ((JsonArray)Value).Values;
        }
        set
        {
            Type = JType.Array;
            Value = new JsonArray { Values = value };
        }
    }

    public Dictionary<string, JValue> Object
    {
        get
        {
            if (Type != JType.Object) throw new InvalidCastException();
            return ((JsonObject)Value).Values;
        }
        set
        {
            Type = JType.Object;
            Value = new JsonObject { Values = value };
        }
    }

    public JValue this[string key]
    {
        get { return Object[key]; }
        set { Object[key] = value; }
    }

    public int Count
    {
        get { return Array.Count; }
    }

    public JValue this[int index]
    {
        get { return Array[index]; }
        set { Array[index] = value; }
    }

    public override string ToString()
    {
        return Value.ToString();
    }
}

internal class JsonValue
{
}

internal class JsonBool : JsonValue
{
    public bool Value;
    public override string ToString()
    {
        return Value.ToString();
    }
}

internal class JsonNumber : JsonValue
{
    public double Value;
    public override string ToString()
    {
        return Value.ToString();
    }
}

internal class JsonString : JsonValue
{
    public string Value;
    public override string ToString()
    {
        return Value.ToString();
    }
}

internal class JsonArray : JsonValue
{
    public List<JValue> Values;
}

internal class JsonObject : JsonValue
{
    public Dictionary<string, JValue> Values;
}

我试图用此函数重写ToString(),但它没有给我值。

public override string ToString()
{
    return Value.ToString();
}

任何意见,将不胜感激。

您必须在派生自JsonValue每个类中重写ToString()方法,因为JValue.ToString()调用未被重写的JsonValue.ToString()方法,以便它将显示该类的全名。

另外,我建议将公共字段替换为公共自动属性。

因此,例如:

internal class JsonBool : JsonValue
{
    public bool Value { get; set; }

    public string override ToString()
    {
        return Value.ToString();
    }
}

更新#1:

更好的解决方案是引入泛型类型,以便避免大量的ToString()覆盖。

internal class JsonValue<T>
{
    public T Value { get; set; }

    public override string ToString()
    {
        return Value.ToString();
    }
}

internal class JsonBool : JsonValue<bool>
{
}

internal class JsonDouble : JsonValue<double>
{
}

Gabor的答案是正确的,您需要在JsonValue派生对象上重写ToString 他关于泛型和用属性替换字段的其他建议也很好。

对于数组和对象类型,您需要遍历这些类型中包含的值。 您可能需要使用代码来使输出按您想要的方式输出。

请注意,下面的代码没有考虑嵌套项目。 例如,如果您的JsonObject所持有的JValue 也是一个JsonObject所持有的更多值。

internal class JsonArray : JsonValue
{
    public List<JValue> Values;
    public override string ToString()
    {
        return string.Join(", ", Values ?? Enumerable.Empty<JValue>());
    }
}

internal class JsonObject : JsonValue
{
    public Dictionary<string, JValue> Values;
    public override string ToString()
    {
        if (Values == null || Values.Count <= 0)
        {
            return "";
        }

        var builder = new StringBuilder();
        foreach (var item in Values)
        {
            builder
                .AppendFormat("{0}: {1}", item.Key, item.Value)
                .AppendLine();
        }

        return builder.ToString();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM