1. 程式人生 > >記dynamic的一個小坑 -- RuntimeBinderException:“object”未包括“xxx”的定義

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

idt time 集中 names 屬性 trac 匿名 nal library

創建一個控制臺程序和一個類庫, 在控制臺創建一個匿名對象。然後再在類庫中訪問它。代碼例如以下:

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類型的屬性,自然會報錯。

知道了原因,解決起來就非常easy了,僅僅須要在當前程序集的AssemblyInfo.cs中加上

[assembly: InternalsVisibleTo("ClassLibrary1")]  

指定對指定程序集可見就可以。

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