2016-04-27 13 views
0

メッセージと任意の型の情報オブジェクト(通常は匿名オブジェクト)をとる例外クラスを記述する必要があります。値型配列を参照型配列に変換する

私は次のコードを持っている:彼らは、オブジェクトと、このタイプを継承しませんので、匿名オブジェクトのプロパティの1つが値型指定されたアイテムの配列であるとき

public SpecialException(string message, object info) : this(message) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(info.GetType())) 
    { 
     object value = property.GetValue(info); 
     string valueStr = value.GetType().IsArray ? (value as IEnumerable<object>).Select(x => x.ToString()).Aggregate((x, y) => $"{x}, {y}") : value.ToString(); 
     sb.AppendLine($"{property.Name} = {valueStr}"); 
    } 
    Info = sb.ToString(); 
} 

問題があり、このコードは動作しませんが共分散のものはそれらと一緒に働くことはできません。私が試みたが、仕事や無粋しないのどちらか見つけたもの

:使用

  • Dictionary<string, object> - IDictionary<string, object>インタフェースを使用してAdd方法
  • をオーバーライドすることはできません - インターフェイスのすべてのメソッドを実装する必要はありません。単純な例外の場合
  • ExpandoObjectdynamicキーワードを使用すると、上記のコードと同じ問題が発生します。
  • 0を使用してJSONにシリアル化とNewtonsoft JSONは - 私は何とかを反復処理することで、おそらく、これを達成するために(おそらく、リフレクションを使用して)エレガントな方法があるとし、サードパーティのライブラリに依存(またはWeb DLL)

をしたくありませんアレイ。誰もが解決策を提案できますか?

+2

'(IEnumerableをとして値)' - .Cast (> '(IEnumerableをとして値))' – PetSerAl

+1

値の型は、実際には動作しませんどのようにobject' –

+0

'を継承していますか?あなたは例外を取得していますか? –

答えて

1

差異は値タイプでは機能しません。そのため、値型配列はIEnumerable<object>にキャストできませんが、それでも非汎用のIEnumerableインターフェイスにキャストできます。その後、Cast<object>()拡張メソッドを呼び出してIEnumerable<object>インスタンスを取得することができます。

((IEnumerable)value).Cast<object>() 
関連する問題