一、起因:
最近在做的一个项目,因为很多地方要用到同一套流程。为了后期维护,要求将共用流程进行抽离,创建为一个公用的类库。在抽离之前程序运行是没有问题的,然而在抽离之后就得到了如题错误: object不包含xxx的定义。 遇到这个错误时也是相当的郁闷,根本就觉得莫名奇妙,完全相同的代码,只是拿出来以类库的形式调用而已。
二、查找:
遇到问题总得想法子解决,接下来就是进行调试,调试下来就更是摸不着头脑。来看下面的两张截图。看到图一的错误,立即对products进行了监视,看到的结果却是图二这样的(哎呀,这不明明有IsOk属性吗?什么鬼...)。由于完全没有思路,无从下手,于是开始了面向百度编程,找到了这个bug的原因。
(图一)
(图二)
三、解决:
原来是匿名类型在编译后,访问修饰符是internal级别的,当跨程序集访问时就会出现如题错误(apiTL.ProductList()返回的是一个匿名类型)。这也就是为什么在抽离前程序运行是正常的(因为在同一程序集中),而抽离后报错的原因。知道了原因,就来解决它。
示例:
程序集A(匿名对象所在的程序集);程序集B(调用程序集A的方法,接收匿名对象)。那么只需要在 程序集A 的AssemblyInfo.cs中加上如下语句,意思是对指定的程序集可见(既:对程序集B可见)
[assembly: InternalsVisibleTo("程序集B")]