首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#如何获取调用者的调用者成员名称?

在C#中,可以使用StackTrace类来获取调用者的调用者成员名称。StackTrace类提供了对调用堆栈的访问,可以获取调用堆栈中的帧信息。

以下是一个示例代码,演示如何使用StackTrace类获取调用者的调用者成员名称:

代码语言:txt
复制
using System.Diagnostics;

public class MyClass
{
    public void Method1()
    {
        string callerMemberName = GetCallerMemberName();
        Console.WriteLine("Caller member name: " + callerMemberName);
    }

    public void Method2()
    {
        Method1();
    }

    private string GetCallerMemberName()
    {
        StackTrace stackTrace = new StackTrace();
        StackFrame[] stackFrames = stackTrace.GetFrames();

        // 获取调用者的调用者帧
        StackFrame callerFrame = stackFrames[2];
        MethodBase callerMethod = callerFrame.GetMethod();

        // 获取调用者的调用者成员名称
        string callerMemberName = callerMethod.Name;
        return callerMemberName;
    }
}

在上述示例中,GetCallerMemberName方法使用StackTrace类获取调用堆栈信息,并通过索引2获取调用者的调用者帧。然后,通过GetMethod方法获取调用者的调用者方法,并从中获取成员名称。

请注意,索引2表示调用者的调用者帧,如果需要获取更深层次的调用者信息,可以根据实际情况调整索引值。

这是一个简单的示例,演示了如何使用StackTrace类获取调用者的调用者成员名称。在实际应用中,可以根据需要进行适当的调整和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在 Go 函数中获取调用者函数名、文件名、行号...

如果让我们用 Go 设计一个Log Facade,就需要我们自己在门面里获取调用者函数名、文件位置了,那么在Go里面怎么实现这个功能呢?...//获取是 CallerA函数调用者调用栈 pc1, file1, lineNo1, ok1 := runtime.Caller(1) } 函数返回值为调用栈标识符、带路径完整文件名...获取调用者函数名 runtime.Caller 返回值中第一个返回值是一个调用栈标识,通过它我们能拿到调用栈函数信息 *runtime.Func,再进一步获取调用者函数名字,这里面会用到函数和方法如下...return fi.name } return funcname(f.funcInfo()) } 使用示例 下面看一个使用 runtime.Caller 和 runtime.FuncForPC 一起配合获取调用者信息简单例子...总结 今天介绍了通过 runtime.Caller 回溯调用栈获取调用者信息方法,虽然强大,不过频繁获取这个信息也是会对程序性能有影响。

6.2K20

读者提问:反射是如何获取结构体成员信息

我们先看一下读者问题: 我们通过两个问题来解决他疑惑: 结构体在内存中是如何存储 反射获取结构体成员信息过程 结构体是如何存储 结构体是占用一块连续内存,一个结构体变量大小是由结构体中字段决定...("name: %v \n", fieldType.Name) } } // 运行结果 name: Name name: Age name: Gender 接下来我们就一起来看一看Go语言是如何通过反射来获取结构体成员信息...首先我们来看一看reflect.TypeOf()方法是如何获取到类型: func TypeOf(i interface{}) Type { eface := *(*emptyInterface)(unsafe.Pointer...bool // 是否为匿名字段 } 到这里整个反射获取结构体成员信息过程应该很明朗了吧~。...总结 本文没想详细展开讲解Go语言反射原理和过程,只是简单介绍了一下反射获取到结构体成员信息过程,更多关于反射知识讲解会在后面持续更新,敬请期待~。

1.1K20

反射机制、依赖注入、控制反转

看如下这个问题在各种社会形态里如何解决:一个人(实例,调用者)需要一把斧子(实例,被调用者)。 (1).原始社会里,几乎没有社会分工。需要一把斧子的人(调用者)只能自己去磨一把斧子(被调用者)。...对应情形为:Java或C#程序里调用者自己创建被调用者。 (2).进入工业社会,工厂出现。...对应Spring依赖注入。 第一种情况下,Java或C#实例调用者创建被调用实例,必然要求被调用类出现在调用者代码里。无法实现二者之间松耦合。...所以,控制反转是,关于一个对象如何获取他所依赖对象引用,这个责任反转。原来依赖关系是调用者调用被调用者,现在反过来是被调用者注册到调用者。...再换句话说,我们提到过解除强依赖,这并不是说调用者和被调用者之间一览关系不存在了,事实上调用者无论如何也需要某类被调用者提供服务,我们只是把何种依赖建立时间推后了,从编译器推迟到了运行时。

66320

dotnet C# 如何正确获取藏文字数

在咱国内有很多有趣文字,其中藏文属于有趣文字里面特别有趣一项,特别是对于做文本库同学,大概都知道什么叫合写字吧。合写字含义就是多个字符一起组成一个字。...但是多个字符在内存中,本身就是多个字符对象,以往统计某个字符串字数,咱简单判断只是拿字符串字符数量进行获取。...用 string.Length 获取 དིོེུ 这个字也是符合预期 5 个字符,当然这也是不符合预期字数 这是关于语言文化方面的内容,自己写一定是不靠谱。...好在 .NET 里面提供权威获取方法,通过 StringInfo 类辅助,可以获取可视效果下字符串字数 var info = new StringInfo("དིོེུ"); var realLength...= info.LengthInTextElements; // realLength = 1 通过此即可获取正确字符长度 额外,如果想要枚举一个藏文句子每个藏文字。

72710

C++11模板:如何判断类中是否有指定名称成员变量?

https://blog.csdn.net/10km/article/details/51113805 如何判断类中有指定成员函数,网上可以找到不少文章,比如下面这两篇就写得很详细了...《C++11之美》 《C++模板,判断是否存在成员函数,实现差异化操作 》 我现在关心如何判断一个类中有成员变量?...成员变量有可能是数组,也可能是其他类。...看了上面关于判断成员函数文章,理解其原理后,判断是否成员变量,也是差不多道理,实现起来非常简单: /* 模板函数,检查T是否有名为's'成员 * value 为bool型检查结果 * type...注意: 模板函数中这一句 static auto check(_T)->typename std::decay::type; decltype(_T::s)已经获取

4K10

关于.NET参数传递方式思考

协变形用于向调用者返回某项操作值;逆变性是指调用者想API传入值;不变性是相对于协变性和逆变性,是指什么也不会发生。对于这方面的知识非常丰富,有兴趣可以自行了解,这里就不做详细介绍了。...dynamic类型,C#是一门静态类型语言,在某些情况下,C#编译器要寻找特定名称而不是接口。dynamic可以在编译时做任何事,到执行时再由框架进行处理。...(d).可选参数可以为任何类型,但对于指定默认值却有一些限制,那就是默认值必须为常量(数字或字符串字面量、null、const成员、枚举成员、default(T)操作符)。     ...3.传递可变数量参数:       在项目开发中,有时我们需要定义一个方法来获取可变数量参数。可以使用params,params只能应用于方法签名中最后一个参数。...AttributeUsage也定义了属性使用方式。     C#编译器检测到一个方法调用时,会检查所有具有指定名称、同时参数没有应用ParamArrayAttribute方法。

1.9K90

八、通用类型系统

.成员如下: (1)、字段 作为对象状态一部分数据变量.字段根据名称和类型来区分 (2)、方法 针对对象执行操作函数,通常会改变对象状态,方法有一个名称、一个签名以及一个或多个修饰符。...签名指定参数数量(及其顺序).参数类型:方法是否有返回值,如果有返回值,还要指定返回值类型. (3)、属性 对于调用者,属性看起来像是字段.但对于类型实现者,属性看起来像是一个方法(或者两个方法,get...具体请参考C# 事件 3、成员修饰符 通用类型系统(CTS)指定了类型可见性规则以及类型成员访问规则.如下: (1)、public 如果将类型标记为public,那么任何程序集都能看见并访问该类型 (...2)、assembly(在C#中使用internal修饰符) 只有在同一个程序集中代码才能看见并访问该类型. (3)、private 被private修饰成员智能由同一个类型中其他成员访问 (4)...、family(在C#中使用protected修饰符) 成员可由派生类型访问,不管那些类型是否在同一程序集中 (5)、protected internal 成员只能由同一程序集中任何类型来访问.

1.1K60

设计模式--命令模式

在命令模式中,包含一个命令接口和具体命令实现类,以及一个调用者(invoker)类和一个接收者(receiver)类。调用者通过调用接口中方法执行命令,发起请求,接收者则负责实际执行命令。...Invoker:调用者角色,负责调用具体命令执行。它包含一个指向 Command 接口引用,用于发起命令请求。...下面是一个使用 C# 实现命令模式示例: using System; // 定义命令接口 public interface ICommand { void Execute(); } //...Invoker类是调用者类,它包含了一个ICommand接口类型成员变量,可以接收不同具体命令对象。当需要执行操作时,调用ExecuteCommand()方法,实现对命令调用执行。...在客户端代码中,通过创建具体命令对象并将其传递给调用者类,来执行不同命令,实现了命令之间解耦。 【小结】 日拱一卒,终有所获。

23960

精:C#这些年来受欢迎特性

此外,方法名称被写为 IDateProvider.GetDate() ,它将接口名称作为限定符前缀。 这两件事情使得调用更明确。 显式接口实现一个很好方面是它强制消费者依赖于接口。...显式实现接口实例对象必须使用接口本身,而没有其他可用接口成员! 但是,当您将其声明为接口或将此实现作为期望接口参数传递时,成员将如预期可用。 这是特别有用方面,因为它强制使用接口。...同样,明确接口实现避免命名或方法签名歧义 - 并使单个类可以实现具有相同成员多个接口。...编者注:学习如何C# 中 使用泛型来提高应用程序可维护性 泛型向.NET Framework引入了类型参数概念,这使得可以设计类和方法来推迟一个或多个类型规范,直到类或方法被客户端代码声明和实例化为止...Action、Func 类型只是 System 名称空间中预定义一般委托。 让我们从解决一个假设问题开始,使用 lambda 表达式来帮助我们编写一些富有表现力和简洁 C# 代码。

14930

C# 这些年来受欢迎特性

此外,方法名称被写为 IDateProvider.GetDate() ,它将接口名称作为限定符前缀。 这两件事情使得调用更明确。 显式接口实现一个很好方面是它强制消费者依赖于接口。...显式实现接口实例对象必须使用接口本身,而没有其他可用接口成员! 但是,当您将其声明为接口或将此实现作为期望接口参数传递时,成员将如预期可用。 这是特别有用方面,因为它强制使用接口。...同样,明确接口实现避免命名或方法签名歧义 - 并使单个类可以实现具有相同成员多个接口。...编者注:学习如何C# 中 使用泛型来提高应用程序可维护性 泛型向.NET Framework引入了类型参数概念,这使得可以设计类和方法来推迟一个或多个类型规范,直到类或方法被客户端代码声明和实例化为止...Action、Func 类型只是 System 名称空间中预定义一般委托。 让我们从解决一个假设问题开始,使用 lambda 表达式来帮助我们编写一些富有表现力和简洁 C# 代码。

16420
领券