神奇的[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“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eshop截取字符串长度 和去掉省略号

<!-- {if $goods.goods_brief} --> {$goods.goods_brief|truncate:17}<!-- {/if} --> 去掉省略号&#xff1a; 找到includes/lib_base.php 第63行 $newstr . ... 去掉... 即可转载于:https://www.cnblogs.com/wesky/p/4819319.html

C和指针之字符串之实现strcpy函数

1、问题 实现strcpy函数2、代码实现 #include <stdio.h> #include <assert.h> char *str_copy(char *des, const char *src) {assert(src ! NULL);assert(des ! NULL);while ((*des *src) ! \0);return des; } int main() {const char *src "chenyu";c…

java dateTime + long

2019独角兽企业重金招聘Python工程师标准>>> public static void main(String[] args) throws Exception{SimpleDateFormat sdfnew SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // long timeStartsdf.parse("2011-09-20 12:30:45").getTime();l…

IOS 开发环境,证书和授权文件是什么?

一、成员介绍 1. Certification(证书) 证书是对电脑开发资格的认证&#xff0c;每个开发者帐号有一套&#xff0c;分为两种&#xff1a; 1) Developer Certification(开发证书) 安装在电脑上提供权限&#xff1a;开发人员通过设备进行真机测试。 可以生成副本供多台电脑安…

.NET Core中异常过滤器ExceptionFilter的使用介绍

介绍实现需要继承IExceptionFilter 或 IAsyncExceptionFilter。可用于实现常见的错误处理策略。使用场景首先讲一下我们为什么要使用异常过滤器 &#xff0c;如果业务场景复杂&#xff0c;只使用HttpStatusCode&#xff0c;抛出异常后,后期要加很多字段来描述。那么这种就比较不…

程序一启动检查网络,如果没有网络就退出程序

转载于:https://www.cnblogs.com/songxing10000/p/4823812.html

C和指针之多维数组一行存满后会轮到下一行

1、问题 比如二位数组名赋值给一个指针&#xff0c;指针在递增&#xff0c;超过这个行的最后一列后会得到怎么样结果。2、代码举例 #include <stdio.h>int main() {int a[3][3] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int *p NULL;p &a[1][1];printf("first val…

看小说的这些年

从大一开始&#xff0c;就开始看起了小说&#xff0c;不是那种名著类型&#xff0c;而是快餐小说&#xff0c;玄幻、都市、言情、科幻&#xff0c;什么都会看&#xff0c;因为看多了&#xff0c;就会发现&#xff0c;已经没什么可以看的。 谈起快餐小说&#xff0c;已经有很多被…

如何使用 .NET Core 安全地加/解密文件

前言由于客户网络安全限制&#xff0c;连接到互联网的设备不能访问内网。需要先从客户端应用中导出数据到文件&#xff0c;再将文件复制到U盘&#xff0c;最后通过内网机器上传数据。如何保证&#xff0c;在复制、传输过程中&#xff0c;文件的安全性&#xff1f;思路首先想到的…

使用Css截取字符串

white-space:nowrap; /* 禁止自动换行 */ overflow:hidden; /* 隐藏溢出的内容 */ text-overflow:ellipsis; /* 溢出文本使用...代替 */ 转载于:https://www.cnblogs.com/xiaoxian1369/p/4083974.html

广度优先算法BFS

package myalgorithm;import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; /*BFS用于记录的位置和值的结构*/ class node {node(int xparam,int yparam,int valparam){this.x xparam;this.y yparam;this.value valparam;}int x,y,value; } publ…

COMA(一): Learning to Communicate with Deep Multi-Agent Reinforcement Learning 论文讲解

Learning to Communicate with Deep Multi-Agent Reinforcement Learning 论文讲解 论文链接&#xff1a;https://papers.nips.cc/paper/6042-learning-to-communicate-with-deep-multi-agent-reinforcement-learning.pdf &#xff08;这篇论文是COMA三部曲中的第&#xff08…

C和指针之指针数组和指向数组的指针

1、指针数组 定义一个指针数组&#xff0c;该数组中每个元素是一个指针&#xff0c;每个指针指向哪里就需要程序中后续再定义int *p[10]; 2、指向数组的指针 定义一个数组指针&#xff0c;该指针指向含10个元素的一维数组&#xff08;数组中每个元素是int型&#xff09;int (*p…

SSH 远程执行任务

SSH 是 Linux 下进行远程连接的基本工具&#xff0c;但是如果仅仅用它来登录那可是太浪费啦&#xff01;SSH 命令可是完成远程操作的神器啊&#xff0c;借助它我们可以把很多的远程操作自动化掉&#xff01;下面就对 SSH 的远程操作功能进行一个小小的总结。远程执行命令如果我…

分库分表之历史表如何选择最佳分片路由规则

前言先别急着关闭,我相信这篇文章应该是所有讲分表分库下的人都没有和你们讲过的一种分片模式,外面的文章基本上都是教你如何从零开始分片,现在我将讲解的是如何从1开始分片项目地址github地址 https://github.com/dotnetcore/sharding-coregitee地址 https://gitee.com/dotnet…

C和指针之二维字符串数组用指针数组、数组指针、二级指针打印

1、问题 二位字符串数组用指针数组、数组指针、二级指针打印 2、测试代码 #include <stdio.h>int main() {char value[4][5] = {"chen", "yu", "feng", "yy"};char *p[5];char (*p1)[5];char **p2;//把二位数组的值赋给指…

Android下强制打开软键盘

这个也是累人&#xff0c;网上查了很多方法&#xff0c;没有实现需求。 最后的实现方法很简单。代码&#xff1a; 1 //通过定时器强制打开虚拟键盘2 public static void TimerShowKeyboard(final View v)3 {4 Timer timer new Timer();5 timer.schedu…

COMA(二):Counterfactual Multi-Agent Policy Gradients 论文讲解

Counterfactual Multi-Agent Policy Gradients 论文链接&#xff1a;https://arxiv.org/pdf/1705.08926.pdf 1. 问题提出&#xff08;解决了什么问题&#xff1f;&#xff09; 在现实世界中&#xff0c;有非常多的问题需要多个单位之间的“合作”才能完成任务&#xff0c;这就…

lecture6-mini批量梯度训练及三个加速的方法

Hinton的第6课&#xff0c;这一课中最后的那个rmsprop&#xff0c;关于它的资料&#xff0c;相对较少&#xff0c;差不多除了Hinton提出&#xff0c;没论文的样子&#xff0c;各位大大可以在这上面研究研究啊。 一、mini-批量梯度下降概述 这部分将介绍使用随机梯度下降学习来训…

C和指针之判断参数在关键字字符串列表中是否匹配

1、题目 *判断参数是否与一个关键字列表任何单词匹配 *并返回匹配的索引值,如果没有找到返回-1 2、代码实现 #include <stdio.h> #include <stdlib.h> #include <string.h>/***判断参数是否与一个关键字列表任何单词匹配*并返回匹配的索引值,…