Microsoft.CSharp.RuntimeBinder.RuntimeBinderException处理办法

抛出“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”异常,原因是匿名类型不能跨程序集(assembly)访问,解决办法有两种:

一、使用 Expando 。

二、在源程序集的AssemblyInfo.cs中加入:[assembly: InternalsVisibleTo("NameSpace1.SubNameSpace1")],匿名类型可以传递到目标程序集。

### C# 中动态类型的使用方法、特性和示例 #### 动态类型概述 在C#中,`dynamic`关键字允许程序员绕过编译时的静态类型检查,在运行时解析成员访问和操作符调用。这使得处理COM互操作、DHTML文档对象模型(DOM)以及脚本语言交互变得更加容易[^1]。 #### 使用方法 当声明变量为 `dynamic` 类型时,实际上告诉编译器放弃对该表达式的任何编译期验证: ```csharp dynamic obj = GetSomeObject(); obj.DoSomething(); // 编译器不会检查DoSomething是否存在或其签名是否正确 ``` 这种做法虽然牺牲了一定程度上的安全性,但是极大地提高了灵活性,尤其是在需要频繁反射或者与不支持强类型的API打交道的时候非常有用。 #### 主要特性 - **延迟绑定**:所有的成员查找都是基于实际的对象实例而不是声明的类型来进行的; - **隐式转换**:可以将任意其他类型的值赋给 dynamic 变量而无需显式转换; - **性能开销**:由于缺少了早期绑定优化的机会,因此可能会带来一定的执行效率损失; - **错误检测推迟到运行时期间**:如果尝试访问不存在的方法/属性,则会在程序运行过程中抛出异常而非构建失败。 #### 示例代码 下面是一个简单的例子展示了如何利用 `dynamic` 来简化某些特定场景下的开发工作: ```csharp using System; class Program { static void Main() { dynamic person = new { Name="John", Age=30 }; Console.WriteLine($"Name: {person.Name}, Age:{person.Age}"); try{ // 这里会引发RuntimeBinderException因为Height未定义 var height = person.Height; }catch(RuntimeBinderException ex){ Console.WriteLine(ex.Message); } } } ``` 此段代码创建了一个匿名对象作为 `dynamic` 类型,并演示了即使是在不知道具体结构的情况下也可以正常读取已知字段的信息;同时也说明了试图访问未知成员将会导致什么样的后果——即抛出了一个 `Microsoft.CSharp.RuntimeBinder.RuntimeBinderException` 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值