ASP.NET MVC 开发 Dynamic匿名类

举报
孙小北 发表于 2022/01/15 19:51:41 2022/01/15
【摘要】 Dynamic遇到了匿名类RuntimeBinderException:“object”未包含“xxx”的定义创建一个项目和一个类库, 在类库创建一个匿名对象,然后再在项目中访问它时报错:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException类型的未经处理的异常在 System.Core.dll 中发生其他信息: “object”未包含“I...

Dynamic遇到了匿名类RuntimeBinderException:“object”未包含“xxx”的定义

创建一个项目和一个类库, 在类库创建一个匿名对象,然后再在项目中访问它时报错:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException类型的未经处理的异常在 System.Core.dll 中发生其他信息: “object”未包含“Id”的定义

属性是肯定存在的,那问题出在哪呢?找了一晚上终于搞定。

原因:匿名类型是internal级别,而internal只能只有在同一程序集中访问。在运行时,dynamic想找到另一个程序集中的internal类型的属性,自然会报错。

namespace Test.A
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = new { Id = 1 };
            var c = new ClassLibrary1.TestClass();
            c.Test(obj);
            Console.ReadLine();
        }
    }
}
namespace Test.B  
{
    public class TestClass
    {
        public void Test(dynamic obj)
        {
            Console.WriteLine(obj.Id);
        }
    }
}

项目A命名空间 Test.A   匿名类型所在

项目B命名空间 Test.B  

在Test.B 中通过dynamic关键字调用Test.A中匿名类型时报上述错误


解决办法:

在项目A的AssemblyInfo.cs中加上:

[assembly: InternalsVisibleTo("Test.B")]

解决方法二

将匿名类转换成实体类

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200