神奇的[Caller*]属性

前言

上次,我们《使用 CallerArgumentExpression 检查弃元参数》,它实际是利用编译器编译时将变量名称传入。

其实,.NET中提供了多个[Caller*]属性,帮助我们轻松获取调用者信息。

CallerFilePathAttribute

允许获取包含调用方的源文件的完整路径。 

FilePath();

static void FilePath([CallerFilePath] string filepath = "")
{
    Console.WriteLine(filepath);
}

CallerMemberNameAttribute

允许获取方法调用方的方法或属性名称。

public void DoProcessing()
{
    MemberName();
}

static void MemberName([CallerMemberName] string name = "")
{
    Console.WriteLine(name);
}

//输出
DoProcessing

CallerLineNumberAttribute

允许获取源文件中调用方法的行号。

LineNumber();

static void LineNumber([CallerLineNumber] int lineNumber = 0)
{
    Console.WriteLine(lineNumber);
}

CallerArgumentExpressionAttribute

允许捕获传递给方法的表达式。

ThrowIfOutOfRange(age <= 0);

static void ThrowIfOutOfRange(bool argument, [CallerArgumentExpression("argument")] string? paramName = null)
{
    if (argument)
        throw new ArgumentOutOfRangeException(paramName);
}

5af1a63cc808d318e93f602525e3320d.png结论

你可以在任何方法中将这些[Caller*]属性作为可选参数,最佳做法是将参数添加到方法的末尾:

public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
{
    System.Diagnostics.Trace.WriteLine("message: " + message);
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}

反编译代码,发现编译器会把代码编译成如下形式

TraceMessage("Hello My IO!");

92da603d83b2f7955ae6854b0ffe1dac.png

想了解更多内容,请关注我的个人公众号”My IO“

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值