记dynamic的一个小坑 -- RuntimeBinderException:“object”未包括“xxx”的定义

创建一个控制台程序和一个类库, 在控制台创建一个匿名对象。然后再在类库中訪问它。代码例如以下:

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")]  

指定对指定程序集可见就可以。

时间: 2024-12-29 23:48:53

记dynamic的一个小坑 -- RuntimeBinderException:“object”未包括“xxx”的定义的相关文章

记dynamic的一个小坑 -- RuntimeBinderException:“object”未包含“xxx”的定义

创建一个控制台程序和一个类库, 在控制台创建一个匿名对象,然后再在类库中访问它,代码如下: 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 ClassLib

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: “object”未包含“get_Range”的定义

asp.net操作Excel合并单元格时,抛出了异常: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: "object"未包含"get_Range"的定义 在 CallSite.Target(Closure , CallSite , ComObject , Object , Object ) 在 System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,

dynamic调用时报RuntimeBinderException:“object”未包含“xxx”的定义 错误

情况如下:两个项目项目A命名空间 Test.PA   匿名类型所在 项目B命名空间 Test.PB 在Test.PB 中通过dynamic关键字调用Test.PA中匿名类型时报上述错误 解决办法 在项目A的AssemblyInfo.cs文件中加入 [assembly: InternalsVisibleTo("Test.PB")]  即可

post到https的一个小坑

一个小坑,坑了我半天时间 本地用的是.net2.0,post按照正常的httpwebrequest方式写没有问题,但是发布到服务器上是.net4.0,于是开始报错“基础连接已关闭:发送时发生错误”. 做了几个修改,于是成功. 1.添加TLS 2.添加httpversion11 3.url改为IP地址(这个不确定有没有关系) post方法如下: ///zhhprivate string Post(string url, string json) { System.Net.HttpWebReques

CI load->view();的一个小坑。。。

CI load->view()  很智能,如果加载多个视图  他会全部读完再按顺序载入所有视图 但这里有一个小坑,底层会遍历你的函数,看有多少视图 再决定当前的视图是否为最后一个, 如果你的代码中有die exit这个的语句, 这个遍历就会被近中止, 所有的视图就都不会执行 切记 切记.. 如果想要中断这种机制,  直接执行视图,不执行下面的语句, : 加上$this->output->_display();就好了 但是这样就会失去灵活性. 谨慎用.

go的变量redeclare的问题,golang的一个小坑

go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int   然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会默认它的类型 下面看一段代码,我们先声明一个变量a,然后再重新声明变量a,b,在这个函数中,变量a被声明了2次,成为a的重声明(redeclare),执行结果为23 package main import ( "fmt" ) func main(){ a:=1 a,b:=2,3 fmt.P

关于sniff函数的一个小坑

最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数. 原文地址:https://www.cnblogs.com/erfze/p/10090910.html

可能你不知道的字符串中的一个小坑!!!

简单的记录一个小问题,一直居然都没怎么注意,心底对自己深深的说了一句:"你真菜"! 平时日常我们接触到的数组去重太常见了.然后对于字符串的去重,也是可能用的IndexOf.或者转成数组去查重,然后再转换回来! 在尝试用其他方法的时候遇见一个小问题,在此记录下来与大家分析! var str = '521213756406'; for(var i = 0; i < str.length-1;i++){ for(var j = i+1;j < str.length; j++){

js变量提升的一个小坑

好久没写博客了,原本想实训结束能对整个实训项目认真总结一下,没想到回到学校一点都不轻松,最近在制作网页版简历,遇到了一个小问题,现在不总结以后肯定忙得顾不上,所以长话短说,抓紧时间写下来. 对js语法比较熟的同学可能都知道:js是没有块级作用域的,有一个新手很容易出错的地方 for(var i = 0 ; i < 10 ; i ++){ setTimeout(function(){ console.log(i) },1000*i) } 这段代码会输出10个10,而不是期望的1,2,...,10,