【发布时间】:2018-09-06 09:25:49
【问题描述】:
我有这个空接口IProvider 和另一个名为ICountryProvider 的接口,它继承自IProvider。我在这样声明的字典中存储了不同类型的“提供者”。
Dictionary<string, IProvider> dic;
现在,当我想获得特定的“提供者”实现时,让它成为 ICountryProvider,我执行以下操作:
var countryProvider = (ICountryProvider)dic["country"];
现在,我担心性能,因为这将在对我的 API 的每个请求上执行。那么,我想问一下,这是一个强制转换操作吗,是否涉及到任何反射相关的操作?
另外,我有一个附带问题,如果它被称为转换,运行时是否会缓存这种“转换”的结果?从
object 到ICountryProvier 和从IProvider 到ICountryProvider 的“转换”之间是否有任何性能差异?
【问题讨论】:
-
是什么让您认为这会使用反射?顺便说一句,这对我来说像是一种代码味道。任何时候你投射到一个更具体的界面都会告诉我你做错了什么。
-
投射与反射无关,投射成本也不高
-
不知道编译器内部是如何实现这个操作的。编译器如何在不需要读取和处理其元数据的情况下从旧类型中找出新类型。另外,如果您能稍微扩展一下您谈到的代码气味,我们将不胜感激,
-
@Mahmoud:编译器不会,但运行时会这样做。如果失败,您将收到
InvalidCastException。 stackoverflow.com/a/2785082/284240 -
@Mahmoud:装箱/拆箱是另一个确实可能是性能瓶颈的话题。如果您必须经常将值类型类型转换为对象并返回到值类型(例如
int),您应该考虑使用不同的(通用)集合并且不要对所有内容都使用 Object。
标签: c# reflection casting type-conversion