from:http://blog.csdn.net/feiyun0112/article/details/39697955
创建一个控制台程序和一个类库, 在控制台创建一个匿名对象,然后再在类库中访问它,代码如下:
[csharp] view plain copy
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- var obj = new { Id = 1 };
- var c = new ClassLibrary1.TestClass();
- c.Test(obj);
- Console.ReadLine();
- }
- }
- }
[csharp] view plain copy
- namespace ClassLibrary1
- {
- public class TestClass
- {
- public void Test(dynamic obj)
- {
- Console.WriteLine(obj.Id);
- }
- }
- }
编译没有问题,但是运行时会提示
“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的未经处理的异常在 System.Core.dll 中发生
其他信息: “object”未包含“Id”的定义
Id属性是肯定存在的,那问题出在哪呢?
让我们用ILDasm查看程序,会发现其实声明的匿名类型是internal级别的。
而internal只能只有在同一程序集中访问。在运行时,dynamic想找到另一个程序集中的internal类型的属性,自然会报错。
知道了原因,解决起来就很简单了,只需要在当前程序集的AssemblyInfo.cs中加上
[assembly: InternalsVisibleTo("ClassLibrary1")]
指定对指定程序集可见即可。
本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/6728482.html,如需转载请自行联系原作者