背景:我们有三个程序集:
打印(将报告生成为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对象的实例。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在您的场景中,您能够通过反射获取到DeliveryNote
对象的实例及其属性,即使没有直接引用该对象所属的程序集(businessObjects),这是因为反射机制允许您在运行时动态地访问和操作类型信息,包括那些在编译时不可见的类型。
具体来说,当您使用反射的GetType()
方法时,它返回的是一个运行时对象的实际类型信息。即使在编写代码的编译阶段没有直接引用到这个类型所在的程序集,只要在运行环境中该程序集被加载(比如通过其他间接引用的方式),您就可以通过反射来探索和操作这个类型。
在这个过程中,以下步骤起了关键作用:
dn.GetType()
获取了dn对象的实际类型,这里是DeliveryNote
。.GetProperty("Order")
和 .GetValue(dn)
操作,您实际上是在运行时从DeliveryNote
类型中获取名为"Order"的属性,并获取该属性在dn实例上的值。Order
对象的IsNeutralDelivery
属性并读取其值。所以,尽管在代码编写阶段没有直接引用businessObjects程序集,但因为最终执行环境中包含了这个程序集,反射就能成功地绕过编译时的类型检查,动态地访问到所需类型和成员。这种方式虽然提供了灵活性,但也需要注意,过度依赖反射可能会降低代码的可读性和维护性,并可能影响性能。