【发布时间】:2023-03-05 15:28:01
【问题描述】:
既然匿名类型无论如何都是编译器生成的,为什么不更进一步,使用索引器访问其属性的值,类似于 ExpandoObject,但使其静态编码。
一些背景: 我目前正试图在 microORM 中尽可能地提高性能,但有一件事让我印象深刻:对匿名类型的反思。
参数作为对象传入,虽然通常不需要是匿名类型。我必须使用反射来获取每个成员的名称和值,因为匿名类型实际上只是编译器生成的 POCO。
在 C# 中使用 ExpandoObject 和其他一些动态结构后,我发现自己缺少 Expando 的显式 IDictionary 接口实现。
【问题讨论】:
-
匿名类型有一个非常独特的目的,它与一些 C# 程序员希望他们做的事情非常几乎没有关系。他们为 Linq 供电,仅此而已。试图让他们做得更多是失败的鲸鱼。性能与它完全无关。
-
我很清楚他们目前不能这样做,并且您对创建构造的最初原因是正确的,但我不同意在 linq 以外的任何东西中使用匿名类型是“失败的鲸鱼” .它们现在是语言的重要组成部分。
-
真正的失败者是匿名类型的成员只有“内部”访问权限。如果您在 Razor 中尝试此操作:@Html.Partial("~/Shared/DatePicker.cshtml", new {id="ctrl1",mode="yearonly"}),它将失败并出现绑定错误,因为 Razor 引擎无法访问匿名类型的属性,即使模型是使用 @model 动态声明的。模型存在并且属性在调试器中可见,但 Razor 实现的默认页面绑定器不会尝试使用反射访问属性。即使您改为传递 ExpandoObject,它仍然会以类似的方式失败。
标签: c# compilation anonymous-types