2009-07-17 18 views
9

Iオブジェクトが新しいように匿名で作成されたかどうかを検出する必要があり、{名前=値}C#の検出AnonymousType新しい{名前=値}と辞書に変換<文字列、オブジェクト>

はAnonymousTypeある場合、

var name="name"; 

var obj = new { name = new object(), }; 

var lookup = new Dictionary<string,object>(); 


if(obj.GetType().Name.StartsWith("<>f__AnonymousType")) 
{ 
    foreach (var property in obj.GetType().GetProperties()) 
    { 
     lookup[property.Name] = property.GetValue(obj, null); 
    } 
} 
else 
{ 
    lookup[name]=obj; 
} 

AnonymousTypesを検出するためのより良い/より高速な方法がある場合、私は、思っていた:それは、これは私が一緒に自分自身をハッキングするものである

Dictionary<string,object> 

にそれがプロパティの名前/値です追加してください またはオブジェクトのプロパティ名をダンプするためのより良い/より高速な方法があるかどうか/

Dictionary<string,object> 
+0

これで何を達成しようとしていますか?それが何であれ、より良い方法が必要です。 –

答えて

24

オブジェクトのすべてのプロパティを取得するには、その値をDictionaryにするには、Linqの機能とオブジェクトをReflectionで結合します。

var dic = obj.GetType() 
      .GetProperties() 
      .ToDictionary(p => p.Name, p=> p.GetValue(obj, null)); 

これはあなたにDictionary<string, object>を返します。

あなたがEnumerable.ToDictionaryメソッドを使用することができます。

+0

問題は、もし彼が最初に辞書を使うことができるのであれば、Linqがその質問に対して狂ったキャッシングをしていない限り、非常に高速です。 –

+0

明示的に宣言したプロパティではなく、 "GenericEqualityComparer"のような "組み込みの"プロパティが表示されるのはどうですか?私は 'GetProperties(BindingFlags.DeclaredOnly)'を試みました。 – drzaus

+0

奇妙な、nevermind - 私は、この反射(オブジェクト拡張ではそれ自体)を使用して変換された結果で自分自身を呼び出すことがわかったので、エクステンションはオブジェクトに対して呼び出されていました。 – drzaus

6

に値ではなく、匿名型の新しいコレクションオブジェクト初期化子の構文を使用します。

var obj = new Dictionary<string, object>() 
{ 
    { "Name", t.Name }, 
    { "Value", t.Value } 
}; 
2

匿名を検出タイプは少しハードです;少なくともそれは言語に依存します。 VBのanon型は、C#のanon型と同じに見えません。私は、行為が非種別によって異なっているという論理について疑念を抱いています。 [CompilerGenerated]をチェックするかもしれませんが、単に "匿名タイプ"を意味するのではなく、これを行う他の人がいます。

個人的には、このシナリオでは区別しません。

関連する問題