揭秘C# 5调用方信息特性:如何精准捕获文件路径、行号与成员名称

第一章:C# 5调用方信息特性的背景与意义

在软件开发过程中,调试和日志记录是确保程序稳定性和可维护性的关键环节。传统的日志方法往往需要手动传入文件名、行号或成员名称,这种方式不仅繁琐,而且容易出错。C# 5 引入的调用方信息特性(Caller Information Attributes)有效解决了这一问题,使开发者能够在不显式传递参数的情况下,自动获取调用方法的相关上下文信息。

提升日志与诊断能力

通过调用方信息特性,开发者可以轻松捕获调用者的源代码位置和成员名称,从而生成更精确的诊断输出。该特性包含三个主要特性类:
  • [CallerFilePath]:获取调用源文件的完整路径
  • [CallerLineNumber]:获取调用所在的行号
  • [CallerMemberName]:获取调用的方法或属性名称

简化方法签名设计

这些特性通常应用于可选参数,编译器会在调用时自动填充对应值,无需运行时反射,性能开销极小。例如,在实现日志记录工具时:
public void LogMessage(string message,
    [CallerFilePath] string filePath = "",
    [CallerLineNumber] int lineNumber = 0,
    [CallerMemberName] string memberName = "")
{
    Console.WriteLine($"[{filePath}:{lineNumber}] {memberName} - {message}");
}
上述代码中,调用者只需传入消息内容,其余信息由编译器自动注入。这不仅减少了参数冗余,也增强了代码的可读性与可维护性。
特性提供信息典型用途
[CallerFilePath]源文件路径定位错误发生文件
[CallerLineNumber]代码行号精确定位错误位置
[CallerMemberName]调用成员名跟踪方法调用链
该特性广泛应用于日志框架、WPF 的 INotifyPropertyChanged 实现以及异常诊断工具中,显著提升了开发效率与问题排查速度。

第二章:调用方信息特性的核心机制解析

2.1 调用方信息特性的编译时注入原理

在现代服务架构中,调用方信息的追踪对安全控制与链路诊断至关重要。编译时注入通过注解处理器或源码生成技术,在代码编译阶段自动织入调用上下文信息。
编译期处理流程
系统利用注解处理器扫描带有特定元数据标记的方法,生成附加的上下文注入代码。该过程不依赖运行时反射,显著提升性能。

@CallSiteInfo
public String queryData(String param) {
    return service.handle(param);
}
上述代码在编译后等价于:

public String queryData(String param) {
    ContextTracker.setCallerInfo("ClassName", "methodName", "timestamp");
    return service.handle(param);
}
其中,ContextTracker.setCallerInfo 由编译器自动插入,参数包括类名、方法名和编译时间戳。
  • 注入信息包括调用类、方法签名、编译时间戳
  • 无需运行时动态获取栈帧,降低开销
  • 支持AOP框架无缝集成

2.2 CallerFilePath特性:捕获源文件的完整路径

特性的基本用途
CallerFilePath 是 .NET 中的编译时特性,用于自动获取调用方法所在源文件的完整路径。它常用于日志记录、调试信息输出等场景,帮助开发者快速定位问题源头。
代码示例与参数说明
public void LogMessage(string message, 
    [CallerFilePath] string filePath = "")
{
    Console.WriteLine($"[文件]: {filePath} - {message}");
}
上述代码中,filePath 参数通过 [CallerFilePath] 特性自动填充为调用该方法的源文件磁盘路径(如:C:\Project\Logger.cs),无需手动传参。
  • 特性仅在参数有默认值时生效
  • 参数类型必须为 string
  • 编译器在调用处注入路径常量
该机制提升了诊断信息的准确性,尤其适用于跨模块调用追踪。

2.3 CallerLineNumber特性:精准定位代码行号

在开发调试过程中,快速定位异常或日志的源头至关重要。CallerLineNumber 特性可自动捕获调用方法时所在的源代码行号,极大提升诊断效率。
基本用法示例
using System.Runtime.CompilerServices;

public void LogMessage(string message, [CallerLineNumber] int lineNumber = 0)
{
    Console.WriteLine($"[Line {lineNumber}] {message}");
}
当调用 LogMessage("发生错误") 时,lineNumber 参数会自动填充为调用处的实际行号。该特性无需手动传参,编译器在编译期注入当前行信息。
常用调用者信息特性对比
特性用途
[CallerLineNumber]获取调用位置的行号
[CallerFilePath]获取调用文件的路径
[CallerMemberName]获取调用的方法或属性名

2.4 CallerMemberName特性:自动获取调用成员名称

在C#中,CallerMemberName 是一个极具实用价值的特性,它允许方法自动获取调用它的成员名称,常用于日志记录、属性变更通知等场景。
基本用法
通过引入 System.Runtime.CompilerServices.CallerMemberNameAttribute,可将调用方的方法名作为默认参数传入:
public void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
    Console.WriteLine($"属性 {propertyName} 发生变化");
}
当调用 NotifyPropertyChanged() 时,无需显式传参,系统会自动填充调用该方法的成员名称,例如来自 SetName 方法的调用将使 propertyName 值为 "SetName"。
优势与典型应用场景
  • 减少硬编码,提升代码可维护性
  • 在实现 INotifyPropertyChanged 接口时避免拼写错误
  • 简化调试与日志输出逻辑

2.5 特性参数的默认值机制与编译优化

在现代编程语言设计中,特性参数的默认值机制显著提升了接口的易用性与向后兼容能力。当调用方未显式传入参数时,编译器会自动注入预设的默认值。
默认值的声明与继承
以 Go 语言为例,可通过结构体标签与反射机制模拟默认值行为:
type Config struct {
    Timeout int `default:"30"`
    Retries int `default:"3"`
}
上述代码通过 default 标签标注字段的默认语义。运行时结合反射可实现自动赋值逻辑,减少模板代码。
编译期优化策略
若默认值在编译期已知,编译器可执行常量折叠与死代码消除。例如,当所有调用均未覆盖默认参数时,相关分支可被静态剪枝,从而减小二进制体积并提升执行效率。

第三章:典型应用场景分析与实践

3.1 在日志记录中自动添加调用上下文信息

在分布式系统中,追踪请求链路是排查问题的关键。通过在日志中自动注入调用上下文信息(如请求ID、用户身份、时间戳),可显著提升日志的可读性和定位效率。
上下文信息的结构化注入
使用线程本地存储(Thread Local)或上下文对象传递机制,在请求入口处初始化上下文,并在整个调用链中透传。
type ContextKey string

const RequestIDKey ContextKey = "request_id"

func WithRequestID(ctx context.Context, rid string) context.Context {
    return context.WithValue(ctx, RequestIDKey, rid)
}

func GetRequestID(ctx context.Context) string {
    if val := ctx.Value(RequestIDKey); val != nil {
        return val.(string)
    }
    return ""
}
上述代码定义了一个上下文键用于存储请求ID,通过 context.WithValue 实现跨函数传递。在中间件中注入后,各层级的日志输出均可获取该值。
日志输出示例
  • 请求ID:唯一标识一次调用链
  • 用户ID:便于权限与行为审计
  • 入口时间:辅助性能分析

3.2 简化INotifyPropertyChanged接口的实现

传统实现的痛点
在WPF或MVVM开发中,INotifyPropertyChanged接口用于通知UI属性变更。传统方式需手动触发事件,代码重复且易出错。
利用CallerMemberName简化代码
通过C#特性[CallerMemberName],可自动获取属性名,避免硬编码字符串。
public class ViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
上述代码中,OnPropertyChanged方法无需传参即可获取调用它的属性名,极大减少出错可能。
现代替代方案
  • 使用CommunityToolkit.MVVM中的ObservableObject
  • 借助AOP或源生成器自动生成通知逻辑

3.3 增强异常诊断能力与调试效率

结构化日志提升可读性
通过引入结构化日志(如 JSON 格式),将时间戳、服务名、调用链 ID 等关键字段统一输出,便于集中采集与分析。相比传统文本日志,结构化日志显著提升了异常定位的准确性。
增强堆栈追踪与上下文注入
在分布式场景中,异常堆栈常因跨服务调用而断裂。以下代码展示了如何在 Go 中封装错误并保留调用链上下文:

type wrappedError struct {
    msg     string
    file    string
    line    int
    cause   error
}

func (e *wrappedError) Error() string {
    return fmt.Sprintf("%s (%s:%d): %v", e.msg, e.file, e.line, e.cause)
}

func Wrap(err error, message string) error {
    _, file, line, _ := runtime.Caller(1)
    return &wrappedError{
        msg:   message,
        file:  filepath.Base(file),
        line:  line,
        cause: err,
    }
}
该实现通过 runtime.Caller 获取调用位置,并将原始错误嵌套传递,确保开发者能逐层追溯错误源头,极大提升调试效率。

第四章:高级技巧与潜在陷阱规避

4.1 条件编译与调用方信息的协同使用

在现代编译系统中,条件编译常用于控制代码路径。结合调用方信息,可实现更智能的编译优化。
动态行为控制
通过预定义宏与调用上下文结合,决定函数行为:
 
#ifdef DEBUG
    printf("Called from: %s:%d\n", __func__, __LINE__);
#endif
该代码仅在调试模式下输出调用位置,利用 __func__ 和 __LINE__ 提供精确上下文。
编译期决策表
宏定义调用信息启用性能影响
NDEBUG否低
TRACE_CALL是高

4.2 避免在公共API中误暴露内部路径信息

在设计公共API时,需警惕响应数据中意外泄露服务器内部路径信息,如文件系统路径、项目目录结构等。此类信息可能为攻击者提供侦察便利,增加安全风险。
常见泄露场景
错误堆栈、日志信息或调试响应常包含 /app/src/utils/helper.go 等路径,直接暴露项目结构。
防护措施
  • 统一异常处理,屏蔽敏感细节
  • 禁用生产环境的调试输出
  • 使用中间件过滤响应中的路径关键字
// Gin框架中拦截错误路径泄露
func SafeErrorHandler(c *gin.Context) {
    defer func() {
        if err := recover(); err != nil {
            log.Printf("Internal error: %v", err) // 仅记录不返回
            c.JSON(500, gin.H{"error": "Internal server error"})
        }
    }()
    c.Next()
}
上述代码通过recover捕获异常,避免原始调用栈和文件路径返回给客户端,确保响应洁净。

4.3 性能影响评估与最佳实践建议

性能基准测试方法
为准确评估系统性能,推荐使用标准化压测工具进行多维度指标采集。以下为使用 wrk 进行 HTTP 接口压测的示例命令:
wrk -t12 -c400 -d30s --latency http://api.example.com/users
该命令启动 12 个线程,维持 400 个并发连接,持续 30 秒,并开启延迟统计。参数说明:-t 控制线程数,-c 设置连接数,-d 定义测试时长。
关键性能指标对比
配置方案吞吐量 (req/s)平均延迟 (ms)错误率
默认配置2,15046.21.8%
调优后配置4,38021.50.2%
优化实践建议
  • 启用连接池复用,减少 TCP 握手开销
  • 合理设置 JVM 堆大小与 GC 策略
  • 对高频查询接口增加本地缓存层
  • 异步化非核心业务逻辑处理

4.4 与其他AOP技术的对比与选型考量

主流AOP实现方式概览
目前常见的AOP技术包括Spring AOP、AspectJ、以及基于代理的框架如Guice AOP。它们在织入时机、性能和功能完整性上存在显著差异。
  • Spring AOP:运行时代理,仅支持方法级别的切面,适用于大多数企业级应用
  • AspectJ:编译期或加载期织入,支持字段、构造器等更细粒度的切入,功能强大但配置复杂
  • Proxy-based AOP:依赖动态代理,限制于接口或继承结构
性能与功能对比
技术织入时机性能开销切点表达式能力
Spring AOP运行时低中等
AspectJ编译/加载期较低强
典型代码示例

@Aspect
public class LoggingAspect {
    @Before("execution(* com.service.*.*(..))")
    public void logMethodCall(JoinPoint jp) {
        System.out.println("Calling: " + jp.getSignature().getName());
    }
}
上述AspectJ切面在目标方法执行前输出日志,execution表达式定义了匹配规则,jp参数提供执行上下文信息,适用于精细控制场景。

第五章:未来展望与C#后续版本的演进方向

随着 .NET 生态系统的持续进化,C# 语言正朝着更高效、更安全和更现代化的方向发展。未来的 C# 版本预计将强化对泛型元编程的支持,并进一步简化异步流处理模型。
模式匹配的深化应用
C# 10 已引入了常量模式和类型模式的增强,而未来版本将进一步扩展递归模式与切片模式。例如,在处理复杂数据结构时:

if (input is [1, var middle, .. var rest] { Length: >= 3 })
{
    Console.WriteLine($"Middle: {middle}, Rest count: {rest.Length}");
}
该语法允许开发者直接解构数组或集合,提升数据提取效率。
性能导向的语言特性
为满足高性能场景需求,C# 正在探索原生大小整数(如 nint、nuint)的优化路径,并加强 ref struct 在跨方法调用中的灵活性。同时,编译器将引入更多内联机制以减少虚调用开销。
  • 支持函数级别内存布局控制
  • 增强 Span<T> 跨异步边界的生命周期管理
  • 静态委托调用的 JIT 优化落地
云原生与微服务集成
C# 将深度适配容器化运行时环境,提供更轻量的启动配置和更低的内存占用。.NET 9 预计推出“精简执行引擎”模式,适用于 Serverless 场景。
版本关键特性适用场景
C# 11原始字符串字面量、泛型属性配置解析、DSL 构建
C# 12主构造函数、集合表达式DTO 定义、测试数据生成
此外,Roslyn 编译器平台将开放更多源生成器 API,使 AOP 和契约验证能以声明式方式嵌入构建流程。
C# PDB文件全解析:从调试符号到生产环境崩溃分析 在软件开发中,调试符号是连接编译后代码与原始源代码的关键桥梁,它记录了变量名、方法名、行号等元数据信息。其核心原理是通过映射表将中间语言指令与源代码位置关联起来,使得调试器能够进行源代码级调试。这一技术不仅提升了开发效率,更在性能分析、代码覆盖率测试等工程实践中发挥重要作用。特别是在生产环境故障诊断场景中,符号文件能够将晦涩的堆栈地址转化为可读的方法名和行号,极大简化了崩溃转储分析流程。本文以C#中的PDB文件为例,深入探讨了传统Windows PDB与便携式PDB的差异,并详细介绍了嵌入式调试符号、符号服 阅读详情

相关推荐

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)内容概要:本文档标题为《Plecs全桥LLC谐振变换器仿真模型.txt》,但实际上内容并未围绕Plecs或全桥LLC谐振变换器展开详细论述,而是罗列了大量基于Matlab/Simulink和Python的科研仿真项目标题及相关技术方向,涵盖电力系统、无人机控制、微电网优化、路径规划、状态估计、信号处理、电动汽车调度、电力电子变换器等多个领域。其中包括多种优化算法(如粒子群、遗传算法、NSGA-II)、控制策略(如PID、MPC、滑模控制)、仿真建模(如LLC谐振变换器、DAB变换器、PWM整流器)以及具体应用场景的研究实现。尽管提及“隔离型全桥LLC谐振变换器建模及参数设计资料”,但全文缺乏对该主题的具体描述、模型细节或仿真分析,仅作为条目之一出现。因此,该文档实质是一份科研项目资源清单或代码合集目录,而非针对某一主题的深入文章。; 适合人群:具备一定Matlab/Simulink或Python编程基础,从事电气工程、自动化、控制科学、电力电子、新能源系统等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①为科研工作者提供丰富的课题参考与复现资源,涵盖优化调度、控制系统设计、电力电子仿真等方向;②辅助完成硕士/博士论文、期刊论文复现、课程设计或项目开发,提升研究效率与创新性;③通过已有模型和代码快速搭建仿真平台,聚焦算法改进与性能优化。; 阅读建议:此文档应作为科研资源索引使用,读者可根据自身研究方向筛选相关条目,结合配套代码与参考资料进行深入学习与实践。对于希望研究全桥LLC谐振变换器的用户,需注意本文档未提供完整内容,建议查找标注的“仿真+设计报告+计算书”等附件资源以获取详细信息。

c# Attribute之CallerMemberName、CallerFilePath、CallerLineNumber 获取方法及代码行号

CallerMemberName、CallerFilePath、CallerLineNumber特性 CallerMemberName:调用方法的名称 CallerFilePath:调用方法的所在的类文件绝对地址 CallerLineNumber:调用方法所在行号 可以用来记录日志,能够获取记录日志所在的行号和方法及调用文件 public class LogHelp { public static void Info( string mess.

czjnoe的博客 951

高校技术转移办公室在推动成果转化过程中,如何高效完成技术成果的信息整合与价值挖掘.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

C#基础与进阶扩展合集-基础篇(持续更新)

sealed,有封装的意思,一般用于修饰类或方法 1、修饰类时,该类不可被继承; 2、修饰方法时,一般用于virtual与抽象方法的继承类,sealed一般与override同时存在,被修饰的已重写的方法不可被其派生类重写。

rwo_bear的博客 4168

高校技术转移办公室人员,如何精准挖掘并分析企业的技术需求?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

奈曼-皮尔逊准则

奈曼-皮尔逊准则 如果各个假设的先验概率P(Hi)(i=0,1)P(H_i)(i=0,1)P(Hi​)(i=0,1)已知,并且每种判决的代价函数已知,这时,可以用贝叶斯准则进行判决。 如果进一步假设正确判决不付出的代价,而错误判决代价相同,即c00=c11=0,c01=c10=1c_{00}=c_{11}=0,c_{01}=c_{10}=1c00​=c11​=0,c01​=c10​=1,这时可以用最小平均错误概率准则进行判决。 在不知道先验概率P(Hi)(i=0,1)P(H_i)(i=0,1)P(Hi​)(

little_soldier的专栏 1万+

Attribute特性定义及应用

Attribute特性定义及应用

againknow的博客 1161

Jetson平台XDMA PCIe驱动安装与测试全指南

本文提供了一份在NVIDIA Jetson平台上安装与测试Xilinx FPGA XDMA PCIe驱动的完整指南。详细阐述了驱动作为高速DMA引擎的核心作用,并逐步讲解了从环境准备、驱动编译、内核模块加载到实际数据传输测试的全过程。内容涵盖常见问题排查与性能优化建议,帮助开发者实现Jetson与FPGA间的高速数据通信,适用于自动驾驶、工业视觉等需要异构计算的应用场景。

weixin_29196315的博客 526

STM32(H7)学习记录-14 XSPI连接DDR SDRAM(HyperBus)

主控芯片是STM32H7S7 ,HyperBusRAM芯片是W956D8MBYA5I。*DQS0(这个引脚是作为RWDS)使用的CubeMX版本是6.13.0。

m0_71918616的博客 1073

centos7下安装gcc-10.3.0

生成多个系统版本的代码,如果你的操作系统是32位,默认就已经设置为 disable,这时gcc仅能生成32位的可执行程序;这里只开启了c,c++ 和fortran,因为支持的语言越多,就需要安装越多的相应静态与动态库,还有五花八门的依赖库,这会让管理变得困难,体积也会变得庞大。启用posix标准的线程支持,这个设置取决于宿主或目标操作系统的类型,其它可用值有:aix,dec,solaris,win32等,如果你是其它的类UNIX系统,就需要设置相应的值。指定安装路径,这里没有指定,就直接放到文件夹里就好。

lxystar2003的博客 1189

揭秘C# 5调用方特性:如何利用三大属性实现精准日志追踪与调试优化

掌握C# 5调用方信息路径,轻松实现精准日志追踪与调试优化。通过CallerMemberName、CallerFilePath和CallerLineNumber三大特性,自动获取调用方信息,提升异常定位效率,广泛应用于日志记录与代码诊断。开发调试利器,值得收藏。

LogicPlex的博客 320

国产Flash替代方案:手把手教你用XSCT烧写ZYNQ7045的BOOT.BIN(附完整命令解析)

本文详细介绍了国产Flash替代方案在ZYNQ7045上的应用,通过XSCT工具链实现BOOT.BIN的精准烧写。内容涵盖国产Flash兼容性检查、PetaLinux环境搭建、XSCT烧写全流程及故障排查,帮助开发者高效完成国产化替代,提升硬件开发效率。

weixin_33670786的博客 427

揭秘C# 5调用方信息特性:3个关键属性让你的代码更智能

掌握C# 5调用方信息特性,轻松实现智能日志与调试。通过CallerFilePath、CallerLineNumber和CallerMemberName三个属性,精准获取调用方信息的路径与位置,提升代码可维护性。适用于异常追踪、日志记录等场景,让开发更高效,值得收藏。

Instrulink的博客 288

C# MES通信从入门到精通(1)——串口传输文件

本文详细介绍了在Mes通信领域如何使用串口发送文件,由实战经验总结,堪称MES通信领域的葵花宝典!

qq_34059233的博客 3750

Cleo Synchronization接口任意文件读取漏洞CVE-2024-50623 附POC

微信公众号搜索:南风漏洞复现文库该文章 南风漏洞复现文库 公众号首发Cleo。

nnn2188185的博客 480

【C# 5调用方信息路径揭秘】:掌握这3个属性让你的日志追踪效率提升10倍

掌握C# 5调用方信息路径,轻松实现精准日志追踪。通过CallerFilePath、CallerLineNumber和CallerMemberName三个属性,快速定位异常源头,提升调试效率。适用于日志记录与错误监控场景,减少排查时间,开发效率倍增,值得收藏。

StepNexus的博客 337

Java Swing教程-16. Swing中的图形绘制

这篇教程介绍了Java Swing中的图形绘制功能,主要内容包括: Graphics类的基本使用 - 介绍了如何重写paintComponent方法实现自定义绘制,以及基本图形绘制方法(线条、矩形、椭圆、多边形等) 文本与图片绘制 - 讲解了文本绘制方法、字体设置和图片加载绘制技术 颜色与字体设置 - 包括预定义颜色、RGB自定义颜色、透明色设置以及字体样式控制 案例实现 - 提供了一个简单绘图程序的框架,支持鼠标绘制不同图形、选择工具和自定义颜色等功能 教程通过代码示例详细演示了各种绘图操作,适合Java

无 233

为什么顶尖程序员都在用Caller Info?揭秘高效调试背后的秘密

掌握C# 5 调用方信息(Caller Info)轻松实现高效调试,减少日志冗余。适用于异常追踪、日志记录等场景,通过CallerMemberName、CallerFilePath等特性自动获取调用信息,提升开发效率。揭秘顶尖程序员的调试秘诀,值得收藏。

QuickDebug的博客 659

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# CallerMemberName、CallerFilePath、CallerLineNumber

CallerFilePath:调用某个方法的主方法所在的类文件地址。CallerMemberName:调用某个方法的主方法名称。CallerLineNumber:调用这个方法所在的行号。用这三个附加属性,需要设置默认值。

Kaizen的博客 1034

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

你真的会用CallerFilePath吗?,深入剖析C# 5调用方信息的隐藏价值

掌握C# 5调用方信息路径技巧,轻松定位日志源头。详解CallerFilePath等特性在调试、日志记录中的实际应用,提升代码可维护性与诊断效率。无需手动传参,自动获取文件路径,值得收藏。

LiteTrans的博客 327

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C#特性之CallerMemberName、CallerFilePath和CallerLineNumber

/// <summary> /// Writes an error level logging message. /// </summary> /// <param name="message">The message to be written.</param> public void WriteError(object message, [CallerMemberName] string memberName = "", [CallerFilePath]

qq_37189288的博客 598

C#之CallerMemberName、CallerFilePath、CallerLineNumber

CallerMemberName:调用某个方法的主方法名称 CallerFilePath:调用某个方法的主方法所在的类文件地址 CallerLineNumber:调用这个方法所在的行号 class Program { public static void TraceMessage(string message, [CallerMemberName] string memberName = null, [CallerFilePath] string sourceFi

CsdnLlgl的博客 1566

C#之特性CallerMemberName、CallerFilePath、CallerLineNumber的使用

一、背景 小伙伴们在看代码时,可能会对CallerMemberName、CallerFilePath、CallerLineNumber产生疑惑,这些是什么,又如何使用呢? 二、代码解释 CallerMemberName:调用某个方法的主方法名称 CallerFilePath:调用某个方法的主方法所在的类文件地址 CallerLineNumber:调用这个方法所在的行号 大家把这个例子敲一遍就明白了 using System; using System.Runtime.CompilerServices; n

黑夜の骑士的博客 2381

c# 4.5以上通过CallerFilePath获取调用所在类

public void LogHelpers([CallerFilePath] string propertyName = "") { this.name = name; } 转载于:https://www.cnblogs.com/aaaaq/p/8542479.html

weixin_34395205的博客 421
上一篇: 揭秘IAsyncEnumerable性能瓶颈:如何用C# 8实现高效异步数据流处理
下一篇: 【Laravel开发者必看】:5个你必须知道的hasManyThrough使用陷阱与解决方案
DebugLoom
博客等级 码龄1年 176粉丝 2107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值