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]
,但请注意,它不仅仅意味着“匿名类型” – 还有其他人这样做。
就个人而言,我不会在这种情况下区分。