【问题标题】:Does the conversion between interfaces involve reflection? [duplicate]接口之间的转换是否涉及反射? [复制]
【发布时间】:2018-09-06 09:25:49
【问题描述】:

我有这个空接口IProvider 和另一个名为ICountryProvider 的接口,它继承自IProvider。我在这样声明的字典中存储了不同类型的“提供者”。

Dictionary<string, IProvider> dic;

现在,当我想获得特定的“提供者”实现时,让它成为 ICountryProvider,我执行以下操作:

var countryProvider = (ICountryProvider)dic["country"];

现在,我担心性能,因为这将在对我的 API 的每个请求上执行。那么,我想问一下,这是一个强制转换操作吗,是否涉及到任何反射相关的操作?


另外,我有一个附带问题,如果它被称为转换,运行时是否会缓存这种“转换”的结果?从objectICountryProvier 和从IProviderICountryProvider 的“转换”之间是否有任何性能差异?

【问题讨论】:

  • 是什么让您认为这会使用反射?顺便说一句,这对我来说像是一种代码味道。任何时候你投射到一个更具体的界面都会告诉我你做错了什么。
  • 投射与反射无关,投射成本也不高
  • 不知道编译器内部是如何实现这个操作的。编译器如何在不需要读取和处理其元数据的情况下从旧类型中找出新类型。另外,如果您能稍微扩展一下您谈到的代码气味,我们将不胜感激,
  • @Mahmoud:编译器不会,但运行时会这样做。如果失败,您将收到InvalidCastExceptionstackoverflow.com/a/2785082/284240
  • @Mahmoud:装箱/拆箱是另一个确实可能是性能瓶颈的话题。如果您必须经常将值类型类型转换为对象并返回到值类型(例如int),您应该考虑使用不同的(通用)集合并且不要对所有内容都使用 Object。

标签: c# reflection casting type-conversion


【解决方案1】:

CLR(命令语言运行时)在运行时管理显式转换,检查对象类型树以确保转换有效,即被转换的对象与类型兼容。如果此检查失败,它会抛出 InvalidCastException 以保持类型安全。

据我所知,没有缓存。

【讨论】:

  • 我在等待缓存答案,谢谢!现在关于最后一个问题,由于 CLR 将不得不检查对象类型树,从性能角度来看,在我的示例中,从对象等顶级类型转换和直接更高级别类型(如 IProvider)之间有什么区别。
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 2023-03-07
  • 2012-10-24
  • 1970-01-01
  • 2018-06-28
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多