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

【C#】三个特殊的 Caller Info Attributes

属性名作用
CallerMemberName这个属性会自动捕获调用方法的名称,它常用于简化依赖属性(Dependency Properties)或实现 INotifyPropertyChanged 接口时的代码。
CallerFilePath这个属性会自动获取调用该方法的源文件的完整路径。
CallerLineNumber当一个方法的参数被该属性标记时,编译器会把调用该方法的代码行号作为整数传递给这个参数。

CallerMemberName例子:

public class ViewModel : INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;private string _firstName;public string FirstName{get => _firstName;set{_firstName = value;OnPropertyChanged("FirstName"); // ⚠️ 这里需要手动传入字符串}}protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
using System.ComponentModel;
using System.Runtime.CompilerServices;public class ViewModel : INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;private string _firstName;public string FirstName{get => _firstName;set{_firstName = value;// ✅ 编译器会自动填充 "FirstName"OnPropertyChanged();}}// 🏆 编译器在编译时自动传入调用它的成员名称protected void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

CallerFilePath例子:

using System.Runtime.CompilerServices;public static class Logger
{public static void LogInfo(string message,[CallerFilePath] string sourceFilePath = ""){// 打印文件路径和消息Console.WriteLine($"文件: {sourceFilePath}");Console.WriteLine($"消息: {message}");Console.WriteLine("--------------------");}
}// 在 Program.cs 文件中调用
public class Program
{public static void Main(){Logger.LogInfo("这是一条测试日志。");}
}

输出结果:

输出结果(部分路径可能会根据你的实际情况变化):
文件: C:\Projects\MyProject\Program.cs
消息: 这是一条测试日志。
--------------------

CallerLineNumber:

using System.Runtime.CompilerServices;public static class Logger
{public static void LogDebug(string message,[CallerLineNumber] int lineNumber = 0){// 打印行号和消息Console.WriteLine($"行号: {lineNumber}");Console.WriteLine($"消息: {message}");Console.WriteLine("--------------------");}
}// 在 Program.cs 文件中调用
public class Program
{public static void Main(){Console.WriteLine("主程序开始");Logger.LogDebug("检查点 1"); // 假设这行代码在第 15 行// 更多的代码...Logger.LogDebug("检查点 2"); // 假设这行代码在第 20 行Console.WriteLine("主程序结束");}
}

输出结果:

输出结果(行号可能会根据你的实际情况变化):
主程序开始
行号: 15
消息: 检查点 1
--------------------
行号: 20
消息: 检查点 2
--------------------
主程序结束
http://www.dtcms.com/a/380750.html

相关文章:

  • LangChain4j入门学习
  • Django ORM 模型
  • 【SpringBoot】——原理篇
  • 机器人防爆的详细讲解
  • 【Vue3】06-利用setup编写vue(1)
  • 单序列双指针
  • Linux中进程和线程常用的API详解
  • 【AI论文】多模态大型语言模型的视觉表征对齐
  • php学习(第四天)
  • Vue中使用keep-alive实现页面前进刷新、后退缓存的完整方案
  • Jenkins运维之路(Jenkins流水线改造Day02-1-容器项目)
  • Netty从0到1系列之Netty逻辑架构【上】
  • com.google.common.cache实现本地缓存
  • LeetCode 面试经典 150 题之最后一个单词的长度:逆向遍历高效解法
  • 详解JWT
  • Spring Boot 分布式事务常见问题:Seata、XA 与本地消息表对比
  • 如何在Hugging Face中下载全部文件?
  • AI之VideoTool:AI-Video-Transcriber​​​​​​​的简介、安装和使用方法、案例应用之详细攻略
  • Qt6实现了一个打地鼠小游戏,支持AI自动打地鼠
  • Chapter5—抽象工厂模式
  • WebSocket连接状态监控与自动重连实现
  • 目标计数论文阅读(1)Class-Agnostic Counting
  • LVGL移植2048小游戏全攻略
  • 大模型系列——ChatBI重构企业知识库
  • DEM(数字高程模型)详解
  • 软考 系统架构设计师系列知识点之杂项集萃(144)
  • R语言生物群落(生态)数据统计分析与绘图实践技术应用
  • DPO 深度解析:从公式到工程,从偏好数据到可复用训练管线
  • 今天继续学习Linux系统中shell脚本
  • 开源端到端训练多模态大模型LLaVA 深度拆解