MethodBase.GetCurrentMethod 方法
如果当前正在执行的方法定义泛型类型上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 = ;
Console.WriteLine(t.Value);
Console.WriteLine(); var tg =new Test<int>();
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)
MethodBase.GetCurrentMethod 方法的更多相关文章
- msdn 中MethodBase.Invoke 方法 介绍中的坑
模块开发总结: c#动态调用webservices 来自网络及使用心得. msdn: MethodBase.Invoke 方法 (Object, Object[]) 使用指定的参数调用当前实例所表示的 ...
- 日志系统实战(一)—AOP静态注入
背景 近期在写日志系统,需要在运行时在函数内注入日志记录,并附带函数信息,这时就想到用Aop注入的方式. AOP分动态注入和静态注入两种注入的方式. 动态注入方式 利用Remoting的Context ...
- .NET 中获取调用方法名
在写记录日志功能时,需要记录日志调用方所在的模块名.命名空间名.类名以及方法名,想到使用的是反射(涉及到反射请注意性能),但具体是哪一块儿还不了解,于是搜索,整理如下: 需要添加相应的命名空间: us ...
- C#的扩展方法解析
在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...
- log4net位置与使用方法
<log4net> <appender name="RollingLogFileAppender" type="log4net.Appender.Rol ...
- [No000085]C#反射Demo,通过类名(String)创建类实例,通过方法名(String)调用方法
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...
- Log4Net使用方法
项目里都会用到日志记录..特别是在本地跑的欢畅..一上服务器就嗝屁的时候..日志会帮你大忙.. Log4net算是一种应用的最广泛的日志记录方式了..下面来简略的说下他的用法.. 先下载log4net ...
- C#中log4net使用方法(一)
Log4net是一个第三方开源组件,它设计的主要目的是组合,生成日志信息,同时将配置保存到各种存储介质或者展现平台中,在实际项目中,Log4net可以保存系统运行情况,可以在系统出现异常时,根据保存的 ...
- Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法
public static string GetMethodInfo() { string str = ""; //取得当前方法命名空间 str += & ...
随机推荐
- 一、.net core 集成vue
一.npm安装WebPack (这种情况就会出现在项目外部,只不过借用VS的程序包管理器控制台获取而已) 右击新建项目创建webpack
- mobilefacenet
insightface作者训练的mobileFaceNet: https://github.com/deepinsight/insightface/issues/214 ncnn的转换:http ...
- python dict字典常用操作
字典的特性:key唯一无序 '''特性:key唯一:无序''' info = { 'stu1101': "安徽", 'stu1102': "北京", 'stu1 ...
- YUM源使用阿里镜像
备份系统自带的yum源 # 前提:需要联网才能使用 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bac ...
- 配置apache运行cgi程序
配置apache运行cgi程序 文章目录 [隐藏] ScriptAlias目录的CGI ScriptAlias目录以外的CGI 配置apache运行cgi程序可分为两种情况,一是ScriptAlias ...
- 【LuoguP3747】[六省联考2017] 相逢是问候
题目链接 题意 给定一个长度为 n 的序列 a , 给定一个正整数 c 每次修改操作是把一段区间内的数 \(x_i\) 修改为 \(c^{x_i}\) 询问区间和模 p 的结果 Sol 修改是把一个数 ...
- H5是什么?
找工作面试官都会问你H5吗? 然后做一个前端的我一脸蒙蔽,到底什么是H5? 一般来说刚开始H5 是 Html5标准的简称,但是仅仅是html5标签,几乎什么也做不出来了,最多就是个静态网页,还得用到j ...
- 【python】对于程序员来说,2018刑侦科推理试卷是问题么?
最近网上很火的2018刑侦科推理试卷,题目确实很考验人逻辑思维能力. 可是对于程序员来说,这根本不是问题.写个程序用穷举法计算一遍即可,太简单. import itertools class Solu ...
- shell练习--PAT题目1001:卡拉兹(Callatz)猜想(失败案例)
卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 年的世界 ...
- Shell入门02
Shell入门-02 1.重定向 标准输入(<) 标准输出 标准错误重回定向 程序 = 指令 + 数据 命令 变量 在程序中,数据如何输入?又如何输出? 数据输入:键盘 – 标准输入,但是并 ...