博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 5.0中使用CallerMemberName、CallerFilePath和CallerLineNumber获取代码的调用方信息(转载)...
阅读量:6911 次
发布时间:2019-06-27

本文共 1635 字,大约阅读时间需要 5 分钟。

很多时候,我们需要在运行过程中记录一些调测的日志信息,如下所示:

public void DoProcessing(){    TraceMessage("DoProcessing()被XXX调用");//这里需要知道当前谁调用了DoProcessing(),由于我们并不知道是谁调用了DoProcessing(),所以字符串中的XXX不得而知,无法将完整的日志信息用TraceMessage方法记入日志}

上面TraceMessage("DoProcessing()被XXX调用")中的XXX我们获取不到,导致日志记录不完全。 此外为了调测方便,除了事件信息外,我们往往还需要知道发生该事件的代码位置以及调用栈信息。在C++中,我们可以通过定义一个宏,然后在宏中通过__FILE__和__LINE__来获取当前代码的位置,但C#并不支持宏,往往只能通过StackTrace来实现这一功能,但StackTrace却又不是很靠谱,常常获取不了我们所要的结果。

 

针对这个问题,在.Net 4.5(.NET Core中也可使用)中引入了三个Attribute:CallerMemberName、CallerFilePath和CallerLineNumber。在编译器的配合下,分别可以获取到调用函数(准确讲应该是成员)名称,调用文件及调用行号。上面的TraceMessage函数可以实现如下:

class Program{    public static void TraceMessage(string message,        [CallerMemberName] string memberName = null,        [CallerFilePath] string sourceFilePath = null,        [CallerLineNumber] int sourceLineNumber = default(int))    {        Debug.WriteLine("message: " + message);        Debug.WriteLine("member name: " + memberName);        Debug.WriteLine("source file path: " + sourceFilePath);        Debug.WriteLine("source line number: " + sourceLineNumber);    }    static void Main(string[] args)    {        TraceMessage("Hello world");    }}

 

在VisualStudio的输出窗口中输出结果如下:

message: Hello worldmember name: Mainsource file path: C:\Users\Scott\source\repos\ConsoleApp1\ConsoleApp1\Program.cssource line number: 21

 

另外,在构造函数,析构函数、属性等特殊的地方调用CallerMemberName属性所标记的函数时,获取的值有所不同,其取值如下表所示:

调用的地方

CallerMemberName获取的结果

方法、属性或事件

方法,属性或事件的名称

构造函数

字符串 ".ctor"

静态构造函数

字符串 ".cctor"

析构函数

该字符串 "Finalize"

用户定义的运算符或转换

生成的名称成员,例如, "op_Addition"。

特性构造函数

特性所应用的成员的名称

例如,对于在属性中调用CallerMemberName所标记的函数即可获取属性名称,通过这种方式可以简化  接口的实现。关于调用方信息更详细的资料,请参看MSDN:

 

 

转载地址:http://cbfcl.baihongyu.com/

你可能感兴趣的文章
Matlab画柱状和折线对照图
查看>>
javascript时间戳和日期字符串相互转换
查看>>
链接详解--静态库
查看>>
从0开始学java——JUnit4 复习,其实基本思想还是那些,不过采用了新的注释格式的语法...
查看>>
GNU M4 - GNU Project - 免费软件基金会(FSF)
查看>>
jsp中将后台传递过来的json格式的list数据绑定到下拉菜单select
查看>>
Project Euler 85 :Counting rectangles 数长方形
查看>>
MYSQL查询某字段中以逗号分隔的字符串的方法
查看>>
Excel设置下拉菜单并隐藏下拉菜单来源单元格内容
查看>>
Java8初体验(二)Stream语法详解
查看>>
微服务架构——不是免费的午餐
查看>>
基于HTML5的Web SCADA工控移动应用
查看>>
VS 2015相当不错的功能:C#交互窗口
查看>>
hive复杂类型与java类型的对应
查看>>
[Ubuntu] ubuntu10.04系统维护之Wine的安装
查看>>
iOS获取UIView上某点的颜色值
查看>>
cocos2d-x 3.0 android mk文件 之 自己主动遍历*.cpp文件
查看>>
python数字图像处理(7):图像的形变与缩放
查看>>
设计模式-观察者模式(上)<转>
查看>>
RabbitMQ 集群与高可用配置
查看>>