C#检测AnonymousType new {name = value,}并转换为Dictionary

我需要检测一个对象是否是匿名创建的,如new {name = value,}

如果它是一个AnonymousType,它应该将它的属性名称/值添加到一个

Dictionary 

这就是我自己一起攻击的内容:

 var name="name"; var obj = new { name = new object(), }; var lookup = new Dictionary(); 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 

要获取对象的所有属性,将其值放入Dictionary ,可以将Linq的强大function耦合到带reflection的对象。

您可以使用Enumerable.ToDictionary方法:

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

这将返回一个Dictionary

使用新的集合对象初始值设定项语法而不是匿名类型:

 var obj = new Dictionary() { { "Name", t.Name }, { "Value", t.Value } }; 

检测匿名类型有点困难; 至少它取决于语言! VB匿名类型与C#anon-types看起来不一样。 我对可能在不同类型上的行为有所不同的逻辑持怀疑态度。 您可以检查[CompilerGenerated] ,但请注意,它不仅仅意味着“匿名类型” – 还有其他人这样做。

就个人而言,我不会在这种情况下区分。