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

简介:

from:http://blog.csdn.net/feiyun0112/article/details/39697955

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

[csharp] view plain copy

  1. namespace ConsoleApplication1
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. var obj = new { Id = 1 };
  8. var c = new ClassLibrary1.TestClass();
  9. c.Test(obj);
  10. Console.ReadLine();
  11. }
  12. }
  13. }

[csharp] view plain copy

  1. namespace ClassLibrary1
  2. {
  3. public class TestClass
  4. {
  5. public void Test(dynamic obj)
  6. {
  7. Console.WriteLine(obj.Id);
  8. }
  9. }
  10. }

编译没有问题,但是运行时会提示

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

Id属性是肯定存在的,那问题出在哪呢?

让我们用ILDasm查看程序,会发现其实声明的匿名类型是internal级别的。

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

知道了原因,解决起来就很简单了,只需要在当前程序集的AssemblyInfo.cs中加上

[assembly: InternalsVisibleTo("ClassLibrary1")]  

指定对指定程序集可见即可。




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/6728482.html,如需转载请自行联系原作者

相关文章
jira项目笔记26-TS object 类型 和 {[key:string]: unknown} 定义类型的区别
jira项目笔记26-TS object 类型 和 {[key:string]: unknown} 定义类型的区别
151 0
为什么 wait,notify,notifyAll 在 Object 类定义而不是 Thread 类?
一个较难回答的 Java 问题, Java 编程语言又不是你设计的,你如何回答这个问题呢?需要对 Java 编程的常识进行深入了解才行。 这个问题的好在它能反映面试者是否对 wait - notify 机制有没有了解, 以及他相关知识的理解是否明确。就像为什么 Java 中不支持多继承或者为什么 String 在 Java 中是 final 的问题一样,这个问题也可能有多个答案。
|
测试技术
Object C学习笔记3-对象的使用和定义
  1. 如何定义一个对象   在面向对象的语言中,定义一个对象是使用Class关键字,而在Object-C中则是使用@interface,@interface用于定义对象的属性和方法,@implementation则用于对象的详细描述。
843 0
|
2月前
|
Java
Java Object 类
5月更文挑战第16天
|
2月前
|
存储 算法 Java
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
【5月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
28 2
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
|
13天前
|
Java
【Java】Object类简单解析
【Java】Object类简单解析
15 1
|
18天前
|
前端开发 JavaScript Java
Java基础10-深入理解Class类和Object类(二)
Java基础10-深入理解Class类和Object类(二)
21 5
|
18天前
|
Java C++
Java基础10-深入理解Class类和Object类(一)
Java基础10-深入理解Class类和Object类(一)
19 4
|
2月前
|
Java
【JAVA学习之路 | 基础篇】Object类及重写的equals()与toString()
【JAVA学习之路 | 基础篇】Object类及重写的equals()与toString()
|
24天前
|
Java API
JavaSE——常用API进阶一(1/3)-Object类(Object类的作用、Object类的常见方法-toString方法、equal方法、clone方法)
JavaSE——常用API进阶一(1/3)-Object类(Object类的作用、Object类的常见方法-toString方法、equal方法、clone方法)
15 0