zoukankan      html  css  js  c++  java
  • C# 5.0中使用CallerMemberName、CallerFilePath和CallerLineNumber获取代码的调用方信息(转载)

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

    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 world
    member name: Main
    source file path: C:UsersScottsource
    eposConsoleApp1ConsoleApp1Program.cs
    source line number: 21

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

    调用的地方

    CallerMemberName获取的结果

    方法、属性或事件

    方法,属性或事件的名称

    构造函数

    字符串 ".ctor"

    静态构造函数

    字符串 ".cctor"

    析构函数

    该字符串 "Finalize"

    用户定义的运算符或转换

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

    特性构造函数

    特性所应用的成员的名称

    例如,对于在属性中调用CallerMemberName所标记的函数即可获取属性名称,通过这种方式可以简化 INotifyPropertyChanged 接口的实现。关于调用方信息更详细的资料,请参看MSDN:http://msdn.microsoft.com/zh-cn/library/hh534540.aspx

    原文链接

  • 相关阅读:
    linux oracle命令行窗口命令上下翻阅
    oracle 转移表空间
    perl字符集处理
    Perl解析JSON数据精解
    处理外壳PROC
    FileIsExe
    写壳前的设计
    SEH结构化异常处理03
    SEH结构化异常处理02
    博客首记
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/9775489.html
Copyright © 2011-2022 走看看