2016-10-13 13 views

答えて

2

あなたはJValue.ToString()が、それは、クラスの完全な名前を表示するように上書きされていないJsonValue.ToString()メソッドを呼び出すためJsonValueから派生した各クラスでToString()メソッドをオーバーライドする必要があります。

また、パブリックフィールドをpublic auto-propertiesに置き換えることをお勧めします。例えばので

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

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

UPDATE#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> 
{ 
} 
+0

これは、次のような文字列を初期化するために働きます: – Tommizzy

+0

これは、次のような文字列を初期化するために働きます。var person = new JValue( "Lebron"); – Tommizzy

+0

辞書と配列の値を表示しようとすると、次のようなものが得られます。System.Collections.Generic.Dictionary'2 [System.String、oop_hw.JValue]。私は辞書と配列クラスの各ループのために必要があると仮定しているが、私はそれを構築する方法がわからない。 – Tommizzy

0

ガボールの答えはあなたがJsonValue派生したオブジェクトのToStringを上書きする必要があること、正確です。ジェネリックについての彼の他のアドバイスや、フィールドをプロパティに置き換えることも良いです。

配列とオブジェクト型については、それらの型に含まれる値をループする必要があります。あなたは、あなたがそれが望むように出力を出すために、コードを使いこなす必要があるかもしれません。

以下のコードでは、ネストされたアイテムは考慮されていません。たとえば、JsonObjectJValue)の場合は、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(); 
    } 
} 
関連する問題