C# 确定哪个类称为方法?

C# 确定哪个类称为方法?,c#,.net,reflection,C#,.net,Reflection,我心中有一个应用程序,但我不知道如何做到这一点。假设我在一个不带参数的DLL文件中有一个公共可访问的方法。这个方法有可能知道它叫什么吗?它能分辨出它是从静态的还是实例化的上下文调用的吗?来自某个特定的班级?一个方法可以知道如何调用它吗?您可以从堆栈跟踪中获取调用方信息: StackTrace stackTrace = new StackTrace(); MethodBase methodBase = stackTrace.GetFrame(1).GetMethod(); 此方法可能知道它的名称

我心中有一个应用程序,但我不知道如何做到这一点。假设我在一个不带参数的DLL文件中有一个公共可访问的方法。这个方法有可能知道它叫什么吗?它能分辨出它是从静态的还是实例化的上下文调用的吗?来自某个特定的班级?一个方法可以知道如何调用它吗?

您可以从堆栈跟踪中获取调用方信息:

StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
此方法可能知道它的名称:

string typeName = methodBase.DeclaringType.Name;
string methodName = methodBase.Name;
它可以判断是否从静态或实例化上下文调用:

bool isStaticCall = methodBase.IsStatic
从特定类别:

bool isGeneric = methodBase.DeclaringType.IsGenericType;

如果您的程序有足够的权限,它可以构造一个并逐帧检查以确定谁是调用方。这将获得调用方法、调用类等等。

您可以这样做:

var callingClass = new StackFrame(1).GetMethod().ReflectedType;

1
告诉构造函数跳过当前正在执行的方法。

它可以(C#5.0使这变得容易得多),但是需要在某些日志框架之外完成这项工作是相当糟糕的设计。你确定你真的需要这样做吗?这需要多大的动力?例如,方法上的属性可以记录对该方法的调用,我相信。。。想象一下过时的关键字是如何工作的。我在考虑一个类以一种不会被欺骗的方式向另一个类注册自己的可能性。它可能需要什么特权的副本?如果使用优化编译,这个方法可能会中断,因为调用方法可能是内联的。