所有匿名对象都有相同的方法。只要它们具有相同类型的相同命名字段,它们就可以相互比较,它们都有一个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();
}
}