当前位置: 首页 > news >正文

【.NET Core】你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟

你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟

文章目录

  • 你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟
    • 一、概述
    • 二、CallerMemberNameAttribute类
    • 三、CallerFilePathAttribute 类
    • 四、CallerLineNumberAttribute 类
    • 五、使用示例
    • 六、使用场景
      • 6.1/可用于日志的记录
      • 6.2/CallerMemberName简化InotifyPropertyChange的实现

在这里插入图片描述

一、概述

CallerMemberName、CallerFilePath、CallerLineNumber特性

CallerMemberName:调用方法的名称。

CallerFilePath:调用方法的所有的类文件绝对地址。

CallerLineNumber:调用方法所在行号,可以用来记录日志,能够获取记录日志所在的行号和方法及调用文件。

二、CallerMemberNameAttribute类

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

CallerMemberName属性应用于具有默认值的可选参数。必须为可选参数指定显示默认值。不能将此属性应用于未指定为可选参数。

可以使用CallerMemberName特性来避免将成员名称指定为所调用的方法的String参数。通过使用这种技术,可以避免"重命名重构"不更改String值的问题。这对于以下任务特别有用:

  • 使用跟踪和诊断例程
  • 在绑定数据时实现INotifyPropertyChanged接口。此接口允许对象的属性通知绑定控件该属性已更改,以便此控件能够显示更新的信息。 如果没有 CallerMemberName 特性,则必须将属性名称指定为文本。

三、CallerFilePathAttribute 类

允许获取包含调用方法的源文件的完整路径。这是编译时的文件路径。

将特性应用于CallerFilePath具有默认值的可选参数。必须为可选参数指定显示默认值。不能将此属性应用于未指定为可选参数。

四、CallerLineNumberAttribute 类

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

CallerLineNumber 属性应用于具有默认值的可选参数。 必须为可选参数指定显式默认值。 不能将此属性应用于未指定为可选参数。

五、使用示例

public void DoProcessing()
{TraceMessage("Something happened.");
}public void TraceMessage(string message,[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",[System.Runtime.CompilerServices.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);
}

六、使用场景

6.1/可用于日志的记录

public class LogHelp
{public static void Info(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0){Console.WriteLine("信息为: " + message);Console.WriteLine("方法名称: " + memberName);Console.WriteLine("源文件地址: " + sourceFilePath);Console.WriteLine("方法使用所在行号: " + sourceLineNumber);}public static void Debug(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0){Console.WriteLine("信息为: " + message);Console.WriteLine("方法名称: " + memberName);Console.WriteLine("源文件地址: " + sourceFilePath);Console.WriteLine("方法使用所在行号: " + sourceLineNumber);}public static void Error(Exception ex,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0){Console.WriteLine("信息为: " + ex.Message);Console.WriteLine("方法名称: " + memberName);Console.WriteLine("源文件地址: " + sourceFilePath);Console.WriteLine("方法使用所在行号: " + sourceLineNumber);}}

6.2/CallerMemberName简化InotifyPropertyChange的实现

在WPF中,当我们要使用MVVM的方式绑定一个普通对象的属性时,界面上往往需要获取到属性变更的通知。一般我们会新建一个类,并继承InotifyPropertyChange接口。

class NotifyObject : INotifyPropertyChanged
{private int number;public int Number{get { return number; }set { number = value; OnPropertyChanged("Number"); }}private string text;public string Text{get { return text; }set { text = value; OnPropertyChanged("Text"); }}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName = ""){PropertyChangedEventHandler handler = PropertyChanged;if (handler != null){handler(this, new PropertyChangedEventArgs(propertyName));}}
}

这么做有一个比较大的隐患,那就是用了字符串的硬编码的方式传递了属性名称,一旦拼写错误或因为重构代码忘记去更新这个字符串时,这样就会导致界面上得不到更新。

硬编码的方式来保证两者的一致性是不靠谱的行为

可以是使用InotifyPropertyChange实现

class NotifyObject : INotifyPropertyChanged
{private int number;public int Number{get { return number; }set { number = value; OnPropertyChanged(); }}private string text;public string Text{get { return text; }set { text = value; OnPropertyChanged(); }}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName]string propertyName = ""){PropertyChangedEventHandler handler = PropertyChanged;if (handler != null){handler(this, new PropertyChangedEventArgs(propertyName));}}
}

在新的OnpertyChangeEventHandler,用[CallerMemberName]属性修饰参数,那么在某个属性发生改变时,会调用此函数,propertyName就有了该属性的名字,因此实现前面相同的功能,但我们不需要显示传入属性名了。

http://www.lryc.cn/news/346646.html

相关文章:

  • ubuntu删除opencv
  • K8s源码分析(二)-K8s调度队列介绍
  • OpenGL ES 面试高频知识点(二)
  • 2024第十六届“中国电机工程学会杯”数学建模A题B题思路分析
  • 面向对象的三大特性:封装、继承、多态
  • 目标检测YOLO实战应用案例100讲-基于深度学习的交通场景多尺度目标检测算法研究与应用(中)
  • 前端GET请求下载后端返回数据流文件,并且处理window.open方法跳转白屏方法
  • SD321放大器3V输入电流电压保护二极管25C电源电流
  • geoserver SQL注入、Think PHP5 SQL注入、spring命令注入
  • scrapy的入门
  • 大数据Scala教程从入门到精通第七篇:Scala在IDEA中编写Hello World
  • 设计模式之数据访问对象模式
  • Spring aop切面编程
  • 如何更好地使用Kafka? - 事先预防篇
  • 如何解决 IPA 打包过程中的 “Invalid Bundle Structure“ 错误
  • Vuex:Vue.js 的状态管理库
  • 【简单介绍下Sass】
  • IM 是什么?
  • 俄罗斯方块的代码实现
  • 出海企业哪种组网方案更省事?
  • triton编译学习
  • 源码知识付费系统,在线教学平台需要优化什么?
  • 后端常用技能:解决java项目前后端传输数据中文出现乱码、问号问题
  • SpringBoot中使用MongoDB
  • 【TS】入门
  • Apache ECharts
  • 超详细的胎教级Stable Diffusion使用教程(四)
  • 串口属性中的BM延时计时器问题
  • PyQt6--Python桌面开发(8.QPlainTextEdit纯文本控件)
  • Java | Leetcode Java题解之第83题删除排序链表中的重复元素