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#内获取泛型方法及扩展的更多相关文章

  1. 从一个复杂的json格式的String内获取某key的值

    如题,如何简单的从一个复杂的String格式内获取某个key的值. 例如:从下面String下取到status的值. {"response":{"info":{ ...

  2. C# 获取文件名及扩展名

    C# 获取文件名及扩展名 string aFirstName = aFile.Substring(aFile.LastIndexOf("\\") + 1, (aFile.LastI ...

  3. C# 获取文件名及扩展名【转】

    https://www.cnblogs.com/libushuang/p/5794976.html C# 获取文件名及扩展名 string aFirstName = aFile.Substring(a ...

  4. python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据

    python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据 最近工作太忙了,有一个星期没有更新文章了,本来这一期打算分享一些对龙虎榜数据的分析结果的,现在还没有把数据内的价值很好 ...

  5. python装饰器内获取函数有用信息方法

    装饰器内获取函数有用信息方法 .__doc__用于得到函数注释信息 .__name_用于得到函数名 在函数引用装饰器的时候,函数名会变为装饰器内部执行该函数的名字,所有在直接执行函数名加.__doc_ ...

  6. table内 获取同一行 其他列的value

    table内  获取同一行 其他列的value function move(obj,ud){ var code = document.getElementById("reportName&q ...

  7. java基础(1)-几种获取类的扩展方式

    摘要 在日常开发过程中经常需要获取类的扩展集.即获取类的子类集(抽象类),或者接口实现类.比如说状态模式中,状态构建类,策略模式中的,策略构造方式.本文介绍几种获取方式. 实现 以策略模式为例 定义了 ...

  8. PHP中获取当前页面的完整URL、PHP URL处理、获取不带扩展名的文件名

    javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 PHP实现 #测试网址: http://localhost/blog ...

  9. lua 获取文件名和扩展名

    local str = "aaa.bbb.bbb.txt" --获取文件名 function getFileName(str) local idx = str:match(&quo ...

随机推荐

  1. bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (三) 图片裁剪

    官方的例子 是 长方形的. 我这里 用于 正方形的头像 所以  做如下  修改 #preview-pane .preview-container { width: 73px; height: 73px ...

  2. linux内核源码目录(转)

    Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间. 源代码所有在目录:/usr/src/linux ...

  3. 三星GT-S7572换屏幕教程

    家里人手机被摔坏了,尽管不是什么值钱的手机.可是自从上了大学之后,就一直认为赚钱真的非常不easy,不到逼不得已,就不要乱花钱.于是,就从淘宝上买了外屏.以下是我在淘宝上的链接:点击打开链接.好不ea ...

  4. phpstorm集成phpunit

    1.下载phpunit.phar,将该文件放到某个工程中 2.File > Settings > Languages & Frameworks > PHP > PHPU ...

  5. Cocos2d-x 3.0final 终结者系列教程12-Vector&amp;map&amp;value

    北京时间昨天下午,温40度.中午12:16我来到了篮球场点.思维1分钟决定开站 转球: 我和另一个3队友半开始, 我手中的球的那一刻我突然火爆球不稳,突然问,淡淡的味道橡胶和烧烤的味道混合. 个腾空跳 ...

  6. C# 如何生成CHM帮助文件

    原文:C# 如何生成CHM帮助文件 前一段时间应公司要求,让我开发一个数据库字段信息CHM帮助文件生成软件.结果当时我就二了,这个东西我只用过,不知道咋做啊.没想到老大很随意说一句:"没事, ...

  7. artTemplate模板

    1.介绍 新一代 javascript 模板引擎. 2.性能(引) 1.性能卓越,执行速度通常是 Mustache 与 tmpl 的 20 多倍(性能测试) 2.支持运行时调试,可精确定位异常模板所在 ...

  8. Wijmo 5 + Ionic Framework之:Hello World!

    Wijmo 5 + Ionic Framework之:Hello World! 本教程中,我们用Wijmo 5 和 Ionic Framework实现一个Mobile的工程:Hello World. ...

  9. .Net下简单地实现MD5加密

    在.Net中为我们提供了一个方法HashPasswordForStoringInConfigFile,可以简单方便地实现MD5加密.该方法位于System.Web命名空间下,所以需要在引用中添加Sys ...

  10. 【转】 教你如何创建类似QQ的android弹出菜单

    原文地址:http://www.apkbus.com/android-18034-1-1.html 大家可能看到android的自带的系统菜单比较难看,如图: 2011-12-4 23:13 上传 下 ...