如果当前正在执行的方法定义泛型类型上MethodInfo返回GetCurrentMethod通过泛型类型定义 (即,MethodInfo.ContainsGenericParameters返回true)。 因此,它不反映时调用该方法时所使用的类型自变量。 例如,如果方法M()泛型类型上定义C<T>(C(Of T)在 Visual Basic 中),和GetCurrentMethod从调用C<string>.M(),然后GetCurrentMethod返回C<T>.M()(C(Of T).M()在 Visual Basic 中)。

如果当前正在执行的方法是泛型方法,GetCurrentMethod返回泛型方法定义。 如果在泛型类型上定义的泛型方法MethodInfo从泛型类型定义中获取。

示例

下面的示例定义两种类型。 第一种是一个非泛型类, TestClass,包括构造函数,一个名为方法GetValue,和一个名为的读写属性GetValue。 第二个是名为一个泛型类TestClass<T>,包含一个构造函数,GetValue方法和泛型方法, ConvertValue<Y>。 每个构造函数、 方法和属性访问器包括对的调用GetCurrentMethod方法。

------------------------------------------------------

using System;
using System.Reflection;public class Example
{public static void Main(){var t = new TestClass();  Console.WriteLine(t.GetValue());t.Value = 10;Console.WriteLine(t.Value);Console.WriteLine();var tg =new Test<int>(200);Console.WriteLine(tg.GetValue());var b = tg.ConvertValue<Byte>();Console.WriteLine("{0} -> {1} ({2})", tg.GetValue().GetType().Name,b, b.GetType().Name);}
}        public class TestClass
{private Nullable<int> _value;public TestClass(){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);}public TestClass(int value){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);_value = value;}public int Value{  get {MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);return _value.GetValueOrDefault();}set {MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);_value = value;}}public int GetValue(){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);return this.Value;}
}public class Test<T>
{private T value;public Test(T value){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);this.value = value;}public T GetValue(){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);return value;}public Y ConvertValue<Y>() {MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);Console.Write("      Generic method: {0}, definition: {1}, Args: ", m.IsGenericMethod, m.IsGenericMethodDefinition);if (m.IsGenericMethod) {foreach (var arg in m.GetGenericArguments())Console.Write("{0} ", arg.Name);}Console.WriteLine();try {return (Y) Convert.ChangeType(value, typeof(Y));}catch (OverflowException) {throw; }   catch (InvalidCastException) {throw;}   }
}
// The example displays the following output:
//       Executing TestClass..ctor
//       Executing TestClass.GetValue
//       Executing TestClass.get_Value
//       0
//       Executing TestClass.set_Value
//       Executing TestClass.get_Value
//       10
//
//       Executing Test`1..ctor
//       Executing Test`1.GetValue
//       200
//       Executing Test`1.ConvertValue
//             Generic method: True, definition: True, Args: Y
//       Executing Test`1.GetValue
//       Int32 -> 200 (Byte)

转载于:https://www.cnblogs.com/herizai/p/6972201.html

MethodBase.GetCurrentMethod 方法相关推荐

  1. 如何从代码中获取当前方法的名称[复制]

    本文翻译自:How to get the name of the current method from code [duplicate] This question already has an a ...

  2. 如何找到调用当前方法的方法?

    登录C#时,如何得知调用当前方法的方法的名称? 我知道有关System.Reflection.MethodBase.GetCurrentMethod()全部知识,但是我想在堆栈跟踪中比这低一级. 我已 ...

  3. c# 获取方法所在的命名空间 类名 方法名

    平时我们在记录日志的时候难免会需要直接记录当前方法的路径,以便查找,但是每次都输入方法名称非常的繁琐,同时如果修改了方法名称也要去手动修改日志内容,真的是劳命伤财啊,所以有了如下方法则可解决我们的大难 ...

  4. c#中中读取嵌入和使用资源文件的方法

    Dotnet中嵌入资源(位图.图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Str ...

  5. Linq to Oracle 使用教程(七)将数据库的存储过程映射到方法

    点击这里返回目录 双击 GET_CATEGORIES_AND_PRODUCTS 存储过程,代码如下: 代码 PACKAGE BODY PKG3 IS PROCEDURE GET_CATEGORIES_ ...

  6. 获取到某一方法的调用者的类名、方法名、命名空间

    1.返回当前方法所在的类名: using System.Reflection; string className = MethodBase.GetCurrentMethod().ReflectedTy ...

  7. log4net使用方法

    项目利用log4net来记录日志. 一.引入log4net 项目中引入log4net可以通过nuget引入,这种方式还是比较方便简单的,而且不用害怕某天log4net的程序集误删除. 二.配置log4 ...

  8. C# 打开Excel文件方法

    一.C#怎样打开Excel文件 1.右键–Add DevExpress Item – New Item,新建一个Form窗体 2.打开工具箱,搜索spreadsheetControl 3.将工具spr ...

  9. Winform开发的界面处理优化

    在Winform开发中,客户体验是个很好的参考性指标,如果一个功能使用的时候感觉很流畅,说明我们的程序执行效率还不错,但是随着数据的真多,原先可能流程的地方可能会变得比较卡,这时候就需要追本索源,找到 ...

最新文章

  1. ffmpeg为AVPacket添加解码头信息
  2. vmware安装linux不能和主机互通,Ubuntu18.04系统主机与虚拟机互通问题的解决方法...
  3. python:SyntaxError: invalid syntax报错
  4. “网页内容无法访问”可能是跨域错误!
  5. 牛客网-数据结构笔试题目(二)-万万没想到之抓捕孔连顺思路解析(附源码)
  6. 企业实战——Ansible自动化运维基础知识
  7. ie8和ie11的html代码生成,ie8升级ie11-IE11,IE8
  8. java操作html和word生成pdf,可生成目录和表格
  9. SHT30温湿度传感器工作原理
  10. 易班显示不能连接到服务器检查网络,网络思政教育 “易班网”不一般
  11. 数码照片像素与可冲印照片尺寸对照表
  12. Gyro-3电子陀螺二次开发
  13. gmail邮箱注册软件_前5名:Gmail的替代品,当今的免费软件基金会等
  14. bitcoin简析一
  15. 金融行情尽在掌握 — Google(谷歌)推出谷歌金融 Onebox
  16. JGG | 河北大学杜会龙组综述植物泛基因组学研究
  17. win10下shell入门学习(一)
  18. 啪啪三国2获取服务器信息,啪啪三国2海量资源获取途径攻略
  19. 车载监控4大趋势,TSINGSEE助力车载视频监控高清、智能化发展
  20. python实战演练_《Python高效开发实战》实战演练——基本视图3

热门文章

  1. console用法java_使用console对javaScirpt进行全面调试-全面分析console用法
  2. 一致性代码段和非一致性代码段【转】
  3. WPF-常用布局容器
  4. POJ 2186 popular cow 有向图的强联通问题 Tarjan算法
  5. 不用 IDE 手工创建、开发、编译、安装 Android 应用程
  6. MySQL笔记1:考察内链接、左连接、右连接。
  7. java之filter原理与责任链模式
  8. iview default-file-list 动态赋值不显示
  9. 记录奥林比克/课程录制 洛谷P2255 [USACO14JAN]
  10. IOS开发笔记(Swift):UITableView表格视图的静态使用