C#:让您知道您的方法是被何“人”调用
我们要在DisabledObsoleteMethod函数里限制具有“Obsolete”属性的方法调用,我们如何去做呢?在.Net中提供了一个"StackFrame"类用于表示当前线程上的函数调用堆栈中的某个具体函数,所以我们通过它就可继续编写我们的DisabledObsoleteMethod函数
也许在某些场合下我们想知道自己的某个方法是被谁(哪个方法)调用的?比如下面的例子:
/// <summary>
/// 正常方法
/// </summary>
static void Method1()
{
DisabledObsoleteMethod();
}

/// <summary>
/// 过期方法
/// </summary>
[Obsolete]
static void Method2()
{
DisabledObsoleteMethod();
}

/// <summary>
/// 禁止过期方法调用此方法
/// </summary>
static void DisabledObsoleteMethod()
{
//如果调用此方法的方法中有"Obsolete"标记则不允许继续运行
}
在上面代码中,我们要在DisabledObsoleteMethod函数里限制具有“Obsolete”属性的方法调用,我们如何去做呢?
在.Net中提供了一个"StackFrame"类用于表示当前线程上的函数调用堆栈中的某个具体函数,所以我们通过它就可继续编写我们的DisabledObsoleteMethod函数,代码如下:
/// <summary>
/// 禁止过期方法调用此方法
/// </summary>
static void DisabledObsoleteMethod()
{
StackFrame frame = new StackFrame(1); //偏移一个函数位,也即是获取当前函数的前一个调用函数
MethodBase method = frame.GetMethod(); //取得调用函数
//反射获取其特性
object[] attributes = method.GetCustomAttributes(typeof(ObsoleteAttribute), false);
if (attributes.Length > 0)
{
//包含有"Obsolete"标记抛出错误或做其它处理
throw new Exception(string.Format("方法{0}包括有Obsolete属性已被禁止调用",method.Name));
}

//继续做其它操作
}
到此,当运行Method1时我们的DisabledObsoleteMethod函数就可以正常运作,而Method2就会被抛出异常警告了
因为StackFrame的构造函数可以指定偏移量,所以我们可以使用它获取调用我们的函数时函数调用堆栈里都有些什么函数,也即是可以了解到当前程序的一个流程是如何的,示例代码如下:
class Test
{
static void Main()
{
int offset = 0;
do
{
StackFrame frame = new StackFrame(offset++);
MethodBase method = frame.GetMethod();
if (method == null) break; //如果偏移位置没有函数时,则GetMethod方法返回null
Console.WriteLine(method.Name);

} while (true);
Console.Read();
}
}
其实.NET已经为我们提供了一个StackTrace类,其可以获取函数调用堆栈里的所有函数的有序集合,通过它我们就能将上面的代码简化为下面的代码了,如下:
class Test
{
static void Main()
{
StackTrace trace = new StackTrace();
foreach (StackFrame frame in trace.GetFrames())
{
Console.WriteLine(frame.GetMethod().Name);
}
Console.Read();
}
}
两者输出的结果还是一样的
,如下:
Main
_nExecuteAssembly
ExecuteAssembly
RunUsersAssembly
ThreadStart_Context
Run
ThreadStart
























在上面代码中,我们要在DisabledObsoleteMethod函数里限制具有“Obsolete”属性的方法调用,我们如何去做呢?
在.Net中提供了一个"StackFrame"类用于表示当前线程上的函数调用堆栈中的某个具体函数,所以我们通过它就可继续编写我们的DisabledObsoleteMethod函数,代码如下:

















到此,当运行Method1时我们的DisabledObsoleteMethod函数就可以正常运作,而Method2就会被抛出异常警告了

因为StackFrame的构造函数可以指定偏移量,所以我们可以使用它获取调用我们的函数时函数调用堆栈里都有些什么函数,也即是可以了解到当前程序的一个流程是如何的,示例代码如下:
















其实.NET已经为我们提供了一个StackTrace类,其可以获取函数调用堆栈里的所有函数的有序集合,通过它我们就能将上面的代码简化为下面的代码了,如下:












两者输出的结果还是一样的








看来在控制台程序中也是由某个线程委托开始运作的
来自:http://www.cnblogs.com/kingthy/archive/2008/04/19/1160816.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2011-03-31 windows route 命令详解(转)