c# - 为什么匿名类型没有索引器属性?

标签 c# compilation anonymous-types

既然匿名类型无论如何都是由编译器生成的,为什么它们不进一步使用索引器来访问其类似于 ExpandoObject 的属性值,而是对其进行静态编码。

一些背景: 我目前正在尝试在 microORM 中尽可能提高性能,有一点对我来说很突出:对匿名类型的反射(reflection)。

参数作为对象传递,虽然不要求通常是匿名类型。我必须使用反射来获取每个成员的名称和值,因为匿名类型实际上只是编译器生成的 POCO。

在使用 ExpandoObject 和 C# 中的一些其他动态结构后,我发现自己缺少 Expando 的显式 IDictionary 接口(interface)实现。

最佳答案

如果你看definition of ExpandoObject ,您将看到它实现了 IDictionary 和 IDynamicMetaObjectProvider(让您的代码挂接到 DLR 的神奇部分)。基本上它带来了Python dictionaries的力量(Python 中的字典可以通过基于字符串的“索引器”或使用 . 访问器来访问,就好像它是直接在对象上定义的属性(甚至是函数)一样)。

匿名类型不是动态的。它们在编译时得到解决。您不能添加或减去它们的定义。

一般来说,反射 API 没有“字典”类型的访问权限,尽管我不明白为什么你不能实现它。 IDictionary 是一个接口(interface)...您可以创建一个 IDictionary 实现,它接受一个对象并使用该对象上的反射来解析索引器请求。

关于c# - 为什么匿名类型没有索引器属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27028693/

相关文章:

c# - C# 中的类引用和 GC 循环

c++ - C/C++ 技巧 : define a unified type for multiple different types?

c++ - 使用 C++ 程序中的软件

c# - 如果字段的顺序不同,为什么编译器会为匿名类型生成不同的类

c# - 匿名类型和 2 个列表的交集

c# - 如何在更新属性时调用代码隐藏中的方法?

c# - 在 .NET 中将 int 转换为位数组

database - Oracle数据库软件包的编译历史和错误记录

c# - 将 Take() 与匿名类型一起使用(DB2 Provider)

c# - C#中,当一个变量经过一个函数/方法时,原来的变量会不会改变?