建立一個控制檯程序和一個類庫, 在控制檯建立一個匿名對象,而後再在類庫中訪問它,代碼以下:ui
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var obj = new { Id = 1 }; var c = new ClassLibrary1.TestClass(); c.Test(obj); Console.ReadLine(); } } }
namespace ClassLibrary1 { public class TestClass { public void Test(dynamic obj) { Console.WriteLine(obj.Id); } } }
編譯沒有問題,可是運行時會提示this
「Microsoft.CSharp.RuntimeBinder.RuntimeBinderException」類型的未經處理的異常在 System.Core.dll 中發生
其餘信息: 「object」未包含「Id」的定義spa
Id屬性是確定存在的,那問題出在哪呢?code
讓咱們用ILDasm查看程序,會發現其實聲明的匿名類型是internal級別的。對象
而internal只能只有在同一程序集中訪問。在運行時,dynamic想找到另外一個程序集中的internal類型的屬性,天然會報錯。blog
知道了緣由,解決起來就很簡單了,只須要在當前程序集的AssemblyInfo.cs中加上ci
[assembly: InternalsVisibleTo("ClassLibrary1")]
指定對指定程序集可見便可。string