私はあなたがLinqPadで得た素晴らしいことに触発されてデバッグのための非常に初歩的な汎用オブジェクトプリンタを作ろうとしています。オブジェクトがILookup <,>であるかどうかを検出して印刷するにはどうすればよいですか?
以下は、私の印刷機能の疑似コードです。私のreflection-fooは今のところ弱いですし、オブジェクトがILookupの場合に対処するのに苦労しています。関連するコレクションとともに各キーを表示してルックアップを列挙したいと思います。
ILookupは非ジェネリックインターフェイスを持たず、IDictionaryも実装していないので、現時点では固執しています。o as ILookup<object,object>
と言うことはできません。任意の一般的なインターフェースを調べる方法を知りたいのですが... CustomObject<,,>
の特別なケースがあるとします。
void Print(object o)
{
if(o == null || o.GetType().IsValueType || o is string)
{
Console.WriteLine(o ?? "*nil*");
return;
}
var dict = o as IDictionary;
if(dict != null)
{
foreach(var key in (o as IDictionary).Keys)
{
var value = dict[key];
Print(key + " " + value);
}
return;
}
//how can i make it work with an ILookup?
//?????????
var coll = o as IEnumerable;
if(coll != null)
{
foreach(var item in coll)
{ print(item); }
return;
}
//else it's some object, reflect the properties+values
{
//reflectiony stuff
}
}
、すなわち、 '無効印刷(IDictionaryをdictを)'、 '無効印刷(IEnumerableをienum)'、 '無効印刷(オブジェクトo)'など – mellamokb
@mellamokb - Iそう思った。たぶん私は間違っていますが、相互に再帰的な 'Print'呼び出しは期待通りに動作しません。 – Kobi
@ xanatosによると、 'ILookup'は' IEnumerable'の 'IEnumerable'です。あなたの現在のコードはそのまま動作するはずです。 'ILookup'型のオブジェクトを渡すとどうなりますか? – mellamokb