C#内获取泛型方法及扩展
C#内获取泛型方法及扩展
C#内我们可以通过反射来动态获取实例方法和静态方法,不管方法存在多少个重载都可以通过GetMethod内的第二个参数去筛选出所要获取的方法,代码如下:
type.GetMethod("方法名",newType[]{});//第二个参数是方法对应的参数类型数组
但是当我们要获取的是一个泛型方法且该方法存在其他重载方法的时候,就会出现异常,异常如下:
在这种情况下,只能通过将相应方法名的方法全部获取出来,然后通过遍历去查找符合条件的方法,代码如下:
var methods = targetType.GetMethods(BindingFlags.Public|BindingFlags.Instance).Where(m => m.Name=="方法名"&& m.IsGenericMethod);foreach(MethodInfo method in methods){var parameters = method.GetParameters();if(parameters.Length!= parameterTypes.Length)continue;for(var i =0; i < parameters.Length; i++){if(parameters[i].ParameterType!= parameterTypes[i])break;}//获取到方法}
以上代码仅仅是对于实例对象内的public方法进行查找,如果想要查找静态的public的其他方法,需要修改的地方只有方法的名字和BindingFlags参数就可以了,因此重构一下上面的代码就能满足其他的需求了,重构后的代码如下:
publicstaticMethodInfoGetGenericMethod(Type targetType,string name,BindingFlags flags,paramsType[] parameterTypes){var methods = targetType.GetMethods(flags).Where(m => m.Name== name && m.IsGenericMethod);foreach(MethodInfo method in methods){var parameters = method.GetParameters();if(parameters.Length!= parameterTypes.Length)continue;for(var i =0; i < parameters.Length; i++){if(parameters[i].ParameterType!= parameterTypes[i])break;}return method;}returnnull;}
由于C#3.0为我们提供了扩展方法,因此可以让方法的调用更加简单,而且更能表达方法的作用,只需要在以上代码中的Type targetType前加入this关键字就可以啦,于是乎就可以用以下代码进行调用了:
type.GetGenericMethod("方法名",绑定约束,参数数组);
今天的主题就到这里啦,谢谢!
C#内获取泛型方法及扩展的更多相关文章
- 从一个复杂的json格式的String内获取某key的值
如题,如何简单的从一个复杂的String格式内获取某个key的值. 例如:从下面String下取到status的值. {"response":{"info":{ ...
- C# 获取文件名及扩展名
C# 获取文件名及扩展名 string aFirstName = aFile.Substring(aFile.LastIndexOf("\\") + 1, (aFile.LastI ...
- C# 获取文件名及扩展名【转】
https://www.cnblogs.com/libushuang/p/5794976.html C# 获取文件名及扩展名 string aFirstName = aFile.Substring(a ...
- python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据
python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据 最近工作太忙了,有一个星期没有更新文章了,本来这一期打算分享一些对龙虎榜数据的分析结果的,现在还没有把数据内的价值很好 ...
- python装饰器内获取函数有用信息方法
装饰器内获取函数有用信息方法 .__doc__用于得到函数注释信息 .__name_用于得到函数名 在函数引用装饰器的时候,函数名会变为装饰器内部执行该函数的名字,所有在直接执行函数名加.__doc_ ...
- table内 获取同一行 其他列的value
table内 获取同一行 其他列的value function move(obj,ud){ var code = document.getElementById("reportName&q ...
- java基础(1)-几种获取类的扩展方式
摘要 在日常开发过程中经常需要获取类的扩展集.即获取类的子类集(抽象类),或者接口实现类.比如说状态模式中,状态构建类,策略模式中的,策略构造方式.本文介绍几种获取方式. 实现 以策略模式为例 定义了 ...
- PHP中获取当前页面的完整URL、PHP URL处理、获取不带扩展名的文件名
javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 PHP实现 #测试网址: http://localhost/blog ...
- lua 获取文件名和扩展名
local str = "aaa.bbb.bbb.txt" --获取文件名 function getFileName(str) local idx = str:match(&quo ...
随机推荐
- java界面编程(8) ------ 组合框(下拉列表)
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 与一组单选button的功能类似,组合框(下拉列表)也是强制用户从一组可能的元素 ...
- Flex在使用无线电的button切换直方图横坐标和叙述性说明
1.问题叙述性说明 一组单选button,有周和月之分,选择"周",柱状图横坐标显示的是周,纵坐标显示的是人数:选择"月",柱状图横坐标显示的月,纵坐标显示的是 ...
- Web API-路由(一)
这一篇文章描述了ASP.NET API如何将HTTP请求路由到控制器. 如果你熟悉ASP.NET MVC,Web API路由和MVC路由非常相似,主要的不同地方是Web API使用HTTP方法,而不是 ...
- CSS3 选择器读解
文章资料来自于W3Cfuns CSS3.0 四个基本的结构性伪类选择器:root 此选择器将绑定到页面的根元素中,所谓根元素,是指文档树中最顶层的元素,也就是<html>部 分. < ...
- c语言中逗号运算符和逗号表达式
原文:c语言中逗号运算符和逗号表达式 C语言提供一种特殊的运算符——逗号运算符.用它将两个表达式连接起来.如: 3+5,6+8称为逗号表达式,又称为“顺序求值运算符”.逗号表达式的一般形式为 表达式1 ...
- phpStorm+XDebug+chrome 配置
运行环境: phpStorm 10.0.1 PHP 5.6.24 VC11 x86 Thread Safe Xdebug 2.4.1(PHP 5.6 VC11 TS (32 bit) 1. PHP安装 ...
- Appium Server源码分析之作为Bootstrap客户端
Appium Server拥有两个主要的功能: 它是个http服务器,它专门接收从客户端通过基于http的REST协议发送过来的命令 他是bootstrap客户端:它接收到客户端的命令后,需要想办法把 ...
- 编程算法 - 二叉树的深度 代码(C)
二叉树的深度 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一棵二叉树的根节点, 求该树的深度. 依次选择最深的左右子树, 然后递归加1. ...
- SQL点滴16—SQL分页语句总结
原文:SQL点滴16-SQL分页语句总结 今天对分页语句做一个简单的总结,他们大同小异的,只要理解其中一个其他的就很好理解了. 使用top选项 *from Orders orderid from Or ...
- appserv+win8
在win8系统安装appserv后,假设apache2服务不安装成功,在安装文件夹Apache2.2手动执行apache_servicefix.bat要么apache_serviceinstall.b ...