开发者社区 问答 正文

为什么我可以获得该程序集中未引用的类的实例?

背景:我们有三个程序集:

打印(将报告生成为pdf)->对businessObjects.interfaces的引用

businessObjects(包含我们所有的业务对象)->对businessObjects.interfaces的引用

businessObjects.interfaces(在此声明打印的属性,仅包括所需的属性)->无引用

该对象是这样实现的:

公共接口IDeliveryNote //程序集:businessObjects.interfaces

公共局部类DeliveryNote:IDeliveryNote // Assembly:businessObjects

DeliveryNote中还有一个“ Order”类,其中包含一个“ IsNeutralDelivery”

问题: 某些报表(DeliveryNoterReport)有问题,我们需要从businessObjects.DeliveryNote.Order-对象中包含一个现有属性(IsNeutralDelivery)。实际上,我们无法推出该应用程序(不要问:))

在调试时,我注意到

IDeliveryNote dn = ((IDeliveryNote)this.DataSource); 我还可以访问Order和所需的属性(IsNeutralDelivery)可能只是花哨的Visual Studio魔术,所以我试图通过反射来获得该属性,如下所示:

bool neutralDeliveryAddressIsNeutralDelivery = (bool)dn.GetType().GetProperty("Order").GetValue(dn).GetType().GetProperty("IsNeutralDelivery").GetValue(dn.GetType().GetProperty("Order").GetValue(dn)); 是的,我检索了该值,并可以修复该错误(仅替换printing.dll)

问题: 当我没有引用它所属的程序集时为什么可以得到DeliveryNote对象的实例。

展开
收起
被纵养的懒猫 2019-09-30 14:57:27 369 分享 版权
阿里云 AI 助理回答

在您的场景中,您能够通过反射获取到DeliveryNote对象的实例及其属性,即使没有直接引用该对象所属的程序集(businessObjects),这是因为反射机制允许您在运行时动态地访问和操作类型信息,包括那些在编译时不可见的类型。

具体来说,当您使用反射的GetType()方法时,它返回的是一个运行时对象的实际类型信息。即使在编写代码的编译阶段没有直接引用到这个类型所在的程序集,只要在运行环境中该程序集被加载(比如通过其他间接引用的方式),您就可以通过反射来探索和操作这个类型。

在这个过程中,以下步骤起了关键作用:

  1. dn.GetType() 获取了dn对象的实际类型,这里是DeliveryNote
  2. 之后,通过.GetProperty("Order").GetValue(dn) 操作,您实际上是在运行时从DeliveryNote类型中获取名为"Order"的属性,并获取该属性在dn实例上的值。
  3. 同理,再次通过反射获取Order对象的IsNeutralDelivery属性并读取其值。

所以,尽管在代码编写阶段没有直接引用businessObjects程序集,但因为最终执行环境中包含了这个程序集,反射就能成功地绕过编译时的类型检查,动态地访问到所需类型和成员。这种方式虽然提供了灵活性,但也需要注意,过度依赖反射可能会降低代码的可读性和维护性,并可能影响性能。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: