2016-11-11 8 views
0

オブジェクトをExpandoObjectに変換しようとしています。C#プロパティを取得し、子フィールドのプロパティを再帰的に

これまでのところ、私は、プロパティとフィールドの両方の配列を持っている、

Type type = data.GetType(); 
FieldInfo[] fields = type.GetFields(); 
PropertyInfo[] props = type.GetProperties(); 

私は簡単に小道具を歩くと、それぞれ1の値を取得し、私のExpandoObjectにそれを追加することができます。

public static ExpandoObject ConvertToExpandoObject(object data) 
{ 
    var dynObj = new ExpandoObject(); 

    Type type = data.GetType(); 
    FieldInfo[] fields = type.GetFields(); 
    PropertyInfo[] props = type.GetProperties(); 

    // first the properties... 
    foreach (var property in props) 
    { 
     // add this property 
     ((IDictionary<string, object>)dynObj).Add(property.Name, property.GetValue(data,null)); 

    } 
} 

しかし、私は、このように再び変換メソッドを呼び出したいフィールドごとに:

foreach (var field in fields) 
{ 
    // add this field 
    ((IDictionary<string, object>)dynObj).Add(field.Name,ConvertToExpandoObject(field?? as an object));    
} 

フィールドには入っていますが、問題のフィールドの型がわからないため、フィールド型に変換するには、フィールドを独自の型のオブジェクトに変換するにはどうすればよいですか?

EDIT:

public static ExpandoObject ConvertToExpandoObject(object data) 
{ 
    var dynObj = new ExpandoObject(); 

    Type type = data.GetType(); 
    FieldInfo[] fields = type.GetFields(); 
    PropertyInfo[] props = type.GetProperties(); 

    // first the properties... 
    foreach (var property in props) 
    { 
     // add this property 
     ((IDictionary<string, object>)dynObj).Add(property.Name, property.GetValue(data,null)); 

    } 
    foreach (var field in fields) 
    { 
     // add this field 
     ((IDictionary<string, object>)dynObj).Add(field.Name,ConvertToExpandoObject(field?? as an object));    
    } 
} 

EDIT 2:うまくいけば、それをより明確にする一つのブロックとして

全文

例オブジェクト - 彼らは些細です。それは私が別の観点からそれを見

class Parent 
{ 
    public string parentVar { get; set; } 
    public Child child { get; set; } 
} 

class Child 
{ 
    public string childvar { get; set; } 
} 
+0

...だから私はちょうどそれが最初に、[プロパティ]を削除連載..

ですプロパティの値をそのまま残していますか? – dymanoid

+0

臭い*本当に*魚。フィールド値をそのまま、またはExpandoObjectに展開すると、両方を行うことはできません。フィールドではなくプロパティではなぜこれを行うのかは不明ですが、ほとんど意味がありません。私はあなたが実際に返されたExpandoObjectを使用しようとするときに、オブジェクトが些細なものである場合には、たくさんの問題に遭遇するだろうと思っています。 –

+0

私はそれを正しく説明していないかもしれません。私はプロパティを持っているオブジェクトを持っていて、そのオブジェクトをExpandoObjectに変換していました。次に物事の中で私はプロパティだけでなく、子オブジェクト(フィールド?)を持っていた別のオブジェクトを持っていました。これらはそれぞれ、ExpandoObjectに変換され、出力ExpandoObjectの子として追加される必要があります – Morvael

答えて

0

描画ボードに戻って行くかもしれない...彼らはならないだろうというとき、私は簡単に予見できるようになりました学術的であってもよいし、 究極のオブジェクトは、に変換することでしたExpandoObjectをシリアライズしてからWebクライアントに送信します。プロパティは、ユーザーの認証に基づいて削除することができますので、これはあなたがExpandoObject `にフィールドの値を変換したいのはなぜ

ExpandoObject dynObj = JsonConvert.DeserializeObject<ExpandoObject>(JsonConvert.SerializeObject(data)); 
関連する問題