当前位置: 首页 > news >正文

使用 C# 中的 dynamic 关键字调用类型方法时可能遇到的各种问题

你可以使用 dynamic 来定义一个变量或者字段,随后你可以像弱类型语言一样调用这个实例的各种方法,就像你一开始就知道这个类型的所有属性和方法一样。

但是,使用不当又会遇到各种问题,本文收集使用过程中可能会遇到的各种问题,帮助你解决掉它们。


本文内容

    • 快速入门
    • 编译错误:缺少编译器要求的成员
      • 对于 .NET Core 或者 .NET Standard 项目
      • 对于 .NET Framework 项目
    • 异常:“{0}”未包含“{1}”的定义

快速入门

dynamic 可以这么用:

dynamic foo = GetSomeInstance();
foo.Run("欢迎访问吕毅(lvyi)的博客:blog.walterlv.com");

object GetSomeInstance()
{
    return 诡异的东西;
}

我们的 GetSomeInstance 明明返回的是 object,我们却可以调用真实类中的方法。

接下来讲述使用 dynamic 过程中可能会遇到的问题和解决方法。

编译错误:缺少编译器要求的成员

你初次在你的项目中引入 dynamic 关键字后,会出现编译错误,提示 “缺少编译器要求的成员”。

error CS0656: 缺少编译器要求的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”

对于 .NET Core 或者 .NET Standard 项目

需要为你的项目安装以下两个 NuGet 包:

  • Microsoft.CSharp
  • System.Dynamic.Runtime

引用两个 NuGet 包

于是你的项目里面会多出两个引用:

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <TargetFrameworks>netstandard2.0;net48</TargetFrameworks>
      </PropertyGroup>

      <ItemGroup>
++      <PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
++      <PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" />
      </ItemGroup>

    </Project>

对于 .NET Framework 项目

你需要引用 Microsoft.CSharp

添加引用

引用 Microsoft.CSharp

于是你的项目里面会多出一项引用:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

      <PropertyGroup>
        <TargetFramework>net48</TargetFramework>
      </PropertyGroup>

      <ItemGroup>
++      <Reference Include="Microsoft.CSharp" />
      </ItemGroup>

    </Project>

异常:“{0}”未包含“{1}”的定义

{0} 是类型名称,而 {1} 是使用 dynamic 访问的属性或者方法的名称。

比如,我试图从某个 Attribute 中访问到 Key 属性的时候会抛出以下异常:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:““System.Attribute”未包含“Key”的定义”

出现此异常的原因是:

  • dynamic 所引用的对象里面,没有签名相同的 public 的属性或者方法

于是,如果你确认你的类型里面是有这个属性或者方法的话,那么就需要注意需要将此成员改成 public 才可以访问。


参考资料

  • c# - Why a Microsoft.CSharp.RuntimeBinder.RuntimeBinderException if the invoked method is there? - Stack Overflow

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 程序员可能会使用的各种命名规则
  • System.InvalidOperationException:“BuildWindowCore 无法返回寄宿的子窗口句柄。”
  • System.InvalidOperationException:“寄宿的 HWND 必须是指定父级的子窗口。”
  • 在使用 .NET Remoting 技术开发跨进程通信时可能遇到的各种异常
  • 使用 SetParent 跨进程设置父子窗口时的一些问题(小心卡死)
  • System.ComponentModel.Win32Exception (0x80004005): 无效的窗口句柄。
  • 解决 WPF 嵌套的子窗口在改变窗口大小的时候闪烁的问题
  • WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null
  • WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null
  • 提高使用 Visual Studio 开发效率的键盘快捷键
  • WPF 不要给 Window 类设置变换矩阵(分析篇):System.InvalidOperationException: 转换不可逆。
  • WPF 不要给 Window 类设置变换矩阵(应用篇)
  • git fetch 失败,因为 unable to resolve reference 'refs/remotes/origin/xxx': reference broken
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • 发现电脑屏幕总是不自动关闭?看看你是否打开了这些程序……
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【译】理解JavaScript:new 关键字
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS魔法堂:Absolute Positioning就这个样
  • DOM的那些事
  • Druid 在有赞的实践
  • java取消线程实例
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • windows下如何用phpstorm同步测试服务器
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 聊聊sentinel的DegradeSlot
  • 一道面试题引发的“血案”
  • 一些css基础学习笔记
  • 正则表达式
  • NLPIR智能语义技术让大数据挖掘更简单
  • #ifdef 的技巧用法
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (八)c52学习之旅-中断实验
  • (待修改)PyG安装步骤
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一) springboot详细介绍
  • (一)VirtualBox安装增强功能
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net 怎么循环得到数组里的值_关于js数组
  • .net反混淆脱壳工具de4dot的使用
  • .NET企业级应用架构设计系列之结尾篇
  • ?php echo ?,?php echo Hello world!;?
  • @Autowired多个相同类型bean装配问题
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [<死锁专题>]
  • [20171113]修改表结构删除列相关问题4.txt