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

建立一個控制檯程序和一個類庫, 在控制檯建立一個匿名對象,而後再在類庫中訪問它,代碼以下: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

相關文章
相關標籤/搜索