すべての匿名オブジェクトには同じメソッドがあります。それらは、同じタイプの同じ名前のフィールドを持っている限り、互いに比較することができます。それらはすべて、ToString()
あなたが見ることができるように文字列を与える実装を持っています。ただし、列挙子の実装はありません。なぜ彼らはすべきですか?その意味で、プロパティ名/インデックスなどを列挙できるJavascriptとは異なります。なぜなら、それはC#であり、それがそうではないからです。なぜ違うと思いますか?
同様に機能するものが必要な場合は、幸いなことに、変数とリフレクションを暗黙的に型指定して、そこで役立つようにしています。
var obj = new { Foo = "asd", Bar = "add", Gar = "123" };
var adapter = PropertyAdapter.Create(obj);
foreach (var name in adapter)
Console.WriteLine("obj.{0} = {1}", name, adapter[name]);
public static class PropertyAdapter
{
public static PropertyAdapter<T> Create<T>(T obj)
{
return new PropertyAdapter<T>(obj);
}
}
public class PropertyAdapter<T> : IEnumerable<string>
{
private T obj;
public PropertyAdapter(T obj) { this.obj = obj; }
public override string ToString()
{
return obj.ToString();
}
public object this[string name]
{
get
{
return typeof(T).GetProperty(name).GetValue(obj, null);
}
}
public IEnumerator<string> GetEnumerator()
{
return typeof(T)
.GetProperties()
.Select(pi => pi.Name)
.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}