[英]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.