由于匿名类型无论如何都是编译器生成的,为什么他们不再使用索引器来访问类似于ExpandoObject的属性值,而是使其静态编码。
一些背景: 我目前正试图在microORM中抓住任何最后一点性能,并且有一件事对我来说:对匿名类型的反思。
参数作为对象传入,而通常不需要是匿名类型。我必须使用反射来获取每个成员的名称和值,因为匿名类型只是编译器生成的POCO。
使用ExpandoObject和C#中的一些其他动态结构后,我发现自己缺少Expando的显式IDictionary接口实现。
答案 0 :(得分:2)
如果你看一下definition of ExpandoObject,你会看到它实现了IDictionary和IDynamicMetaObjectProvider(让你的代码挂钩到DLR的神奇片段)。基本上它带来了Python dictionaries的强大功能(Python中的字典可以通过基于字符串的"索引器"或者使用.addoror来访问,就好像它是直接在其上定义的属性(甚至函数)一样。对象)。
匿名类型不是动态的。它们在编译时解析。您无法添加或减去其定义。
一般来说,没有"字典"键入对反射API的访问权限,但我不明白为什么你不能实现它。 IDictionary是一个接口......您可以创建一个IDictionary实现,该实现接受一个对象并使用该对象上的反射来解析索引器请求。
答案 1 :(得分:1)
他们没有索引器,因为您将参数作为基本对象引用类型传入。您可以使用在方法合同中未定义的接口上定义的方法,这是不合理的假设。