記dynamic的一個小坑 -- RuntimeBinderException:“object”未包含“xxx”的定義

feiyun0112發表於2014-09-30

建立一個控制檯程式和一個類庫, 在控制檯建立一個匿名物件,然後再在類庫中訪問它,程式碼如下:

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);
        }
    }
}

編譯沒有問題,但是執行時會提示

“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”型別的未經處理的異常在 System.Core.dll 中發生

其他資訊: “object”未包含“Id”的定義

Id屬性是肯定存在的,那問題出在哪呢?

讓我們用ILDasm檢視程式,會發現其實宣告的匿名型別是internal級別的。

而internal只能只有在同一程式集中訪問。在執行時,dynamic想找到另一個程式集中的internal型別的屬性,自然會報錯。

知道了原因,解決起來就很簡單了,只需要在當前程式集的AssemblyInfo.cs中加上

[assembly: InternalsVisibleTo("ClassLibrary1")]  

指定對指定程式集可見即可。

相關文章