如何使用反射获取调用方法名称和类型? [复制]

     2023-02-26     62

关键词:

【中文标题】如何使用反射获取调用方法名称和类型? [复制]【英文标题】:How do I get the calling method name and type using reflection? [duplicate] 【发布时间】:2011-03-06 23:00:57 【问题描述】:

可能重复:How can I find the method that called the current method?

我想写一个方法来获取调用方法的名称,以及包含调用方法的类的名称。

是否可以使用 C# 反射?

【问题讨论】:

票数最高的答案已过时。该语言现在直接支持这一点。请参阅***.com/a/9621581/1711103 了解 但这并不能解决获取类型的问题。 【参考方案1】:
public class SomeClass

    public void SomeMethod()
    
        StackFrame frame = new StackFrame(1);
        var method = frame.GetMethod();
        var type = method.DeclaringType;
        var name = method.Name;
    

现在假设你有另一个这样的类:

public class Caller

   public void Call()
   
      SomeClass s = new SomeClass();
      s.SomeMethod();
   

name 将是“Call”,type 将是“Caller”。

更新:两年后,我仍然对此表示赞同

在 .NET 4.5 中,现在有一种更简单的方法来执行此操作。您可以利用CallerMemberNameAttribute

继续前面的例子:

public class SomeClass

    public void SomeMethod([CallerMemberName]string memberName = "")
    
        Console.WriteLine(memberName); // Output will be the name of the calling method
    

【讨论】:

这是一个尽可能好的解决方案,但您需要记住,除非您禁用 JIT 方法内联,否则这不一定会返回您在发布版本中期望的答案。 在.NET 3.5的解决方案中,应该在SomeMethod上面加上[MethodImpl(MethodImplOptions.NoInlining)]来避免内联。将 false 传递给构造函数还可以防止从 PDB 文件中加载文件名/行数据,从而加快 StackTrace 的构建。 +1 用于更新答案 值得注意的是,使用[CallerMemberName] 解决方案,编译器会处理整个事情,因此它对性能更好,因为在运行时没有实际反射。 可惜没有[CallerTypeName] 来获取调用方法的声明类型...【参考方案2】:

您可以通过StackTrace 使用它,然后您可以从中获取反射类型。

StackTrace stackTrace = new StackTrace();           // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)

StackFrame callingFrame = stackFrames[1];
MethodInfo method = callingFrame.GetMethod();
Console.Write(method.Name);
Console.Write(method.DeclaringType.Name);

【讨论】:

相关***.com/questions/171970/…【参考方案3】:

这实际上是可以使用当前堆栈跟踪数据和反射的组合来完成的。

public void MyMethod()

     StackTrace stackTrace = new System.Diagnostics.StackTrace();
     StackFrame frame = stackTrace.GetFrames()[1];
     MethodInfo method = frame.GetMethod();
     string methodName = method.Name;
     Type methodsClass = method.DeclaringType;

StackFrame 数组上的1 索引将为您提供名为MyMethod 的方法

【讨论】:

【参考方案4】:

是的,原则上这是可能的,但它不是免费的。

你需要创建一个StackTrace,然后你可以查看调用堆栈的StackFrame's。

【讨论】:

【参考方案5】:

从技术上讲,您可以使用 StackTrace,但这非常慢,并且在很多时候不会给您期望的答案。这是因为在发布构建期间可能会发生优化,这将删除某些方法调用。因此,您无法确定发布时 stacktrace 是否“正确”。

真的,在 C# 中没有任何万无一失或快速的方法。您真的应该问自己为什么需要它以及如何构建您的应用程序,这样您就可以在不知道调用它的方法的情况下做您想做的事情。

【讨论】:

这是 A. 调试版本,B. 调用其他程序集。通过 System.Diagnostics.Process 启动其他程序所需的时间使使用 StackFrame 类所产生的任何事情都相形见绌。 我这样做是为了自动配置测试套件。

c#怎么使用反射获取事件的响应方法

...下,请您务必阅读.完毕后我将给你写出对应的代码.(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。(2)使用Module了解包含模块的程序集以及模块中的类等,... 查看详情

reflection(反射)

...即使这个对象的类型在编译时还不知道。二.反射的用途1.使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例2.使用Module了解包含模块的程序集以及模块中的类等,还可... 查看详情

概述反射和序列化?

...。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性序列化:序列化是将对象转换为容易... 查看详情

如何在 C# 中使用反射调用具有不同类型参数的方法

】如何在C#中使用反射调用具有不同类型参数的方法【英文标题】:HowtocallamethodwithargumentsofdifferenttypesusingreflectioninC#【发布时间】:2011-12-0602:42:11【问题描述】:我正在尝试使用C#中的.NET反射调用一个接受两个参数(一个布尔值... 查看详情

如何在 C# 中使用反射获取类型的完全限定名称

】如何在C#中使用反射获取类型的完全限定名称【英文标题】:HowtogetFullyQualifiedNameofaTypeusingReflectioninC#【发布时间】:2014-01-1303:36:42【问题描述】:我有一个场景,我需要检查控件的DataContext是否正在实现“INotifyPropertyChanged”和... 查看详情

使用反射获取 T 的类型名称

...l:WebUserControlBase<MyDocumentType>...如果我在另一个班级,如何获得MyDocumentType的TypeName?【问题讨论】:***.com/ques 查看详情

如何确定调用方法和类名? [复制]

】如何确定调用方法和类名?[复制]【英文标题】:Howtodeterminecallingmethodandclassname?[duplicate]【发布时间】:2013-01-2818:03:00【问题描述】:我目前正在使用内置的TraceListener开发一个应用程序日志库。这个库将在许多项目中使用,并... 查看详情

如何使用反射来调用泛型方法?

】如何使用反射来调用泛型方法?【英文标题】:HowdoIusereflectiontocallagenericmethod?【发布时间】:2008-10-2405:17:35【问题描述】:当类型参数在编译时未知,而是在运行时动态获取时,调用泛型方法的最佳方式是什么?考虑以下示... 查看详情

java应用java反射:动态类加载和调用教程

...Jackson库进行JSON序列化和反序列化​​​​Java应用【四】如何使用JPA进行对象关系映射和持久化​​​​Java应用【五】使用HttpClient进行HTTP请求和响应处理​​一、反射概述1.1反射是什么?Java反射是指在程序运行时动态地获取... 查看详情

如何使用 Go 反射 pkg 获取切片结构字段的类型?

】如何使用Go反射pkg获取切片结构字段的类型?【英文标题】:HowtouseGoreflectionpkgtogetthetypeofaslicestructfield?【发布时间】:2017-07-0617:58:04【问题描述】:我正在尝试使用反射来构建一个例程,该例程将列出传入的任意结构中所有字... 查看详情

如何使用表达式和/或反射获取常量名称?

】如何使用表达式和/或反射获取常量名称?【英文标题】:HowtogetaConstantNameusingExpressionsand/orreflection?【发布时间】:2013-10-1006:35:41【问题描述】:我写了下面的但“我”总是为空?publicstaticclassTest1publicconststringCampaignManager="This_C... 查看详情

java核心类库之反射机制

...类与实现的接口4):获取类中的所有的方法或者单个方法5):使用反射调用方法&&使用反射调用静态方法6):使用反射调用数组参数7):使用反射,动态拷贝数组7):获取一个类中所有的构造器,获取 查看详情

反射:如何使用参数调用方法

】反射:如何使用参数调用方法【英文标题】:Reflection:HowtoInvokeMethodwithparameters【发布时间】:2011-01-1305:29:11【问题描述】:我试图通过带参数的反射调用一个方法,我得到:对象与目标类型不匹配如果我调用不带参数的方法,... 查看详情

java通过反射怎么获取方法中参数值

答案是没法获取。首先反射获取的是类、属性、或者方法的定义,就拿方法来说,方法的定义是什么呢?方法的定义包括:方法名,方法的参数类型列表,方法的返回值类型。方法的参数类型列表包括什么呢?包括每个参数的顺... 查看详情

.netcore反射获取带有自定义特性的类,通过依赖注入根据attribute元数据信息调用对应的方法(代码片段)

前言  前段时间有朋友问道一个这样的问题,.NETCore中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有CustomAttribute标记的类,然后通过依赖注入(DI)的方式获取对应服务的方法... 查看详情

javase——反射(代码片段)

...到底学什么?反射都是从class字节码文件中获取的内容。如何获取class字节码文件的对象利用反射如何获取构造方法(创建对象)利用反射如何获取成员变量(赋值,获取值)利用反射如何获取成员方法(运行) 获取字节码... 查看详情

golang反射机制的实现分析——reflect.type方法查找和调用(代码片段)

    在《Golang反射机制的实现分析——reflect.Type类型名称》一文中,我们分析了Golang获取类型基本信息的流程。本文将基于上述知识和经验,分析方法的查找和调用。(转载请指明出于breaksoftware的csdn博客)方法... 查看详情

golang反射机制的实现分析——reflect.type方法查找和调用(代码片段)

    在《Golang反射机制的实现分析——reflect.Type类型名称》一文中,我们分析了Golang获取类型基本信息的流程。本文将基于上述知识和经验,分析方法的查找和调用。(转载请指明出于breaksoftware的csdn博客)方法... 查看详情