C# 接口之间的转换是否涉及反射?

C# 接口之间的转换是否涉及反射?,c#,reflection,casting,type-conversion,C#,Reflection,Casting,Type Conversion,我有一个空接口IProvider,另一个接口名为icontyprovider,它继承自IProvider。我将不同类型的“提供者”存储在这样声明的字典中。 Dictionary<string, IProvider> dic; 现在,我关心性能,因为这将在对我的API的每个请求上执行。所以,我想问,这是一个强制转换操作吗?它是否涉及任何与反射相关的操作? 另外,我还有一些次要问题,如果称为转换,运行时是否缓存这种“转换”的结果?从对象到ICountryProvider的“转换”与从

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

Dictionary<string, IProvider> dic;
现在,我关心性能,因为这将在对我的API的每个请求上执行。所以,我想问,这是一个强制转换操作吗?它是否涉及任何与反射相关的操作?

另外,我还有一些次要问题,如果称为转换,运行时是否缓存这种“转换”的结果?从
对象
ICountryProvider
的“转换”与从
IProvider
ICountryProvider
的“转换”之间是否存在性能差异?

CLR(命令语言运行时)在运行时管理显式转换,检查对象类型树以确保转换有效,也就是说,铸造的对象与类型兼容。如果此检查失败,它将抛出一个
InvalidCastException
,以保持类型安全


据我所知,没有进行缓存。

是什么让你认为这会使用反射?顺便说一句,我觉得这像是一种代码味道。任何时候你对一个更具体的接口进行强制转换都会告诉我你做错了什么。强制转换与反射无关,而且成本也不高。我不知道编译器如何在内部实现这个操作。编译器如何从旧类型中找出新类型,而不需要读取和处理其元数据。另外,如果你能对你所说的代码气味做一点扩展,我将不胜感激,@Mahmoud:编译器不会,但会在运行时执行。如果失败,您将获得一个
InvalidCastException
@马哈茂德:装箱/拆箱是另一个确实可能成为性能瓶颈的话题。如果必须将CAST值类型键入对象并返回到值类型(例如<代码> INT/COM> >),则应该考虑使用不同的(泛型)集合,不要对所有对象都使用对象。我在等待缓存答案,谢谢!现在,关于最后一个次要问题,由于CLR必须检查对象类型树,从性能角度来看,在我的示例中,从顶级类型(如object)和直接高级类型(如
IProvider
)进行强制转换之间是否有任何区别。
var countryProvider = (ICountryProvider)dic["country"];