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

.NET/C# 使用反射调用含 ref 或 out 参数的方法

使用反射,我们可以很容易地在运行时调用一些编译时无法确定的属性、方法等。然而,如果方法的参数中包含 refout 关键字的时候,又该怎么调用呢?

本文将介绍如何反射调用含 refout 关键字的方法。


比如我们有这样的类型:

public class Walterlv
{
    public string Get(string key)
    {
    }
}

那么反射的时候可以使用:

var walterlv = new Walterlv();
var value = (string) typeof(Walterlv).GetMethod("Get").Invoke(walterlv, new object[] { "key" });

然而现在我们的函数是这样的,带一个 out 关键字的参数:

public class Walterlv
{
    public bool TryGet(string key, out string value)
    {
    }
}

事实上,无论是什么样的方法,在反射式调用的都是同一个方法,即 Invoke

对于 outref 关键字的方法来说,会更新传入的数组,也就是 Invoke 最后传入的那个参数。所以其实我们只需要保存那个数组的实例,在调用完毕之后便能重新取出被修改的参数了。

var walterlv = new Walterlv();
var args = new object[] { "key", null };
var value = (string) typeof(Walterlv).GetMethod("Get").Invoke(walterlv, args);
// 在这里可以从 args 里面取出被 ref 或者 out 修改的参数。

参考资料

  • out, ref and InvokeMember !!! - CodeProject
  • c# - How to pass a parameter as a reference with MethodInfo.Invoke - Stack Overflow

相关文章:

  • WPF 多线程 UI:设计一个异步加载 UI 的容器
  • .NET 命令行参数包含应用程序路径吗?
  • 分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0(使用 .NET Core 3.0 Desktop API Analyzer )
  • C# 空合并操作符(??)不可重载?其实有黑科技可以间接重载!
  • UWP 轻量级样式定义(Lightweight Styling)
  • 预编译框架,开发高性能应用 - 课程 - 微软技术暨生态大会 2018
  • 将 UWP 中 CommandBar 的展开方向改为向下展开
  • .NET 中创建支持集合初始化器的类型
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!
  • WPF 中的 NameScope
  • Windows 下的高 DPI 应用开发(UWP / WPF / Windows Forms / Win32)
  • 技术、产品、交流、思考 - 微软技术暨生态大会 2018
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • ES6指北【2】—— 箭头函数
  • SegmentFault for Android 3.0 发布
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【5+】跨webview多页面 触发事件(二)
  • 【node学习】协程
  • Debian下无root权限使用Python访问Oracle
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • HTML-表单
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Javascripit类型转换比较那点事儿,双等号(==)
  • mongo索引构建
  • MySQL几个简单SQL的优化
  • React 快速上手 - 07 前端路由 react-router
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 优化 Vue 项目编译文件大小
  • ​你们这样子,耽误我的工作进度怎么办?
  • !$boo在php中什么意思,php前戏
  • ###STL(标准模板库)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (0)Nginx 功能特性
  • (2015)JS ES6 必知的十个 特性
  • (5)STL算法之复制
  • (6)设计一个TimeMap
  • (二)丶RabbitMQ的六大核心
  • (四)汇编语言——简单程序
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)Linux网络编程入门
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net2005怎么读string形的xml,不是xml文件。
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /var/spool/postfix/maildrop 下有大量文件
  • []C/C++读取串口接收到的数据程序
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决