Kingthy's blog
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 40 文章- 0 评论- 382
让您知道您的方法是被何“人”调用
也许在某些场合下我们想知道自己的某个方法是被谁(哪个方法)调用的?比如下面的例子:
/**/
///
<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
看来在控制台程序中也是由某个线程委托开始运作的
Tag标签:
C#
posted @ 2008-04-19 09:20
Kingthy
阅读(2492)
评论(13)
编辑
收藏
网摘
所属分类:
C#
发表评论
回复
引用
查看
#1楼
2008-04-19 10:20 |
代码乱了
不错的,我在权限系统里面就用到这东东,呵呵
回复
引用
查看
#2楼
2008-04-19 10:46 |
Justin
顶!
回复
引用
查看
#3楼
2008-04-19 12:09 |
Jacky Zhong
不错。
回复
引用
查看
#4楼
2008-04-19 13:54 |
Yannic Yang
有个疑问
那假如过期的Method2调用了未过期的Mehtod3,未过期的Method3调用了DisabledObsoleteMethod()这种情况能否过滤呢?
一定需要用一个foreach判断堆栈上所有函数?
另外,不知道多线程情况下有没有问题
回复
引用
查看
#5楼
2008-04-19 15:03 |
airwolf2026
不错...又扩大的眼界
回复
引用
查看
#6楼
2008-04-19 18:35 |
Q.Lee.lulu
学习了
回复
引用
查看
#7楼
[
楼主
]2008-04-19 20:58 |
Kingthy
@Yannic Yang
如果是这种情况则只能一级级往上找了.
多线程也是没有问题的,因为StackFrame是表示当前线程(!!)的调用堆栈中的一个函数调用!l
回复
引用
查看
#8楼
2008-04-20 02:30 |
镜涛
呵呵,找到自己的调用者不错,这样在写日志文件时就不用传递出错类了,只要负责日志文件的类中得到调用者就行了。
回复
引用
查看
#9楼
2008-04-20 08:17 |
生鱼片
学习
回复
引用
查看
#10楼
2008-04-20 09:52 |
李战
路过,雪戏
http://www.cnblogs.com/Emoticons/yoyocici/223852199.gif" alt="" />
回复
引用
查看
#11楼
2008-04-20 13:45 |
Windie Chai
牛,学习了。
回复
引用
查看
#12楼
2008-04-21 14:32 |
流浪的狗
.net的错误信息就是这么抛出来的, 哈哈.
刷新评论
切换模板
发表评论
昵称:
[登录]
[注册]
主页:
邮箱:
(仅博主可见)
验证码:
看不清,换一个
评论内容:
登录
注册
[使用Ctrl+Enter键快速提交评论]
0
1160816
导航:
网站首页
社区
新闻
博问
闪存
网摘
招聘
找找看
Google搜索
China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务
相关文章:
最新IT新闻:
19岁天才黑客发布首个iPhone 3GS破解软件
新浪邮箱大本营粉墨登场!Sina.cn开放注册
IE市场份额首次跌破60%
Google App Engine宕机6小时——云的安全在哪里?
微软新推社交网站Windows Live Planet
相关链接:
公告
本人博客文章,如果不加以说明则为
本人原创
!如果各位需要转载,请注明原作者及出处!谢谢!!
<
2008年4月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我参加的小组
蛋蛋日语学堂
每日一句英语
每天一句日语
我的标签
模版引擎(4)
Linq(3)
验证码识别(2)
文件同步精灵(2)
Flex(1)
Socket5(1)
Template(1)
C#(1)
图片(1)
HTML图片(1)
随笔分类
C#(29)
(rss)
Sql(1)
(rss)
Web(3)
(rss)
其它(6)
(rss)
随笔档案
2009年6月 (1)
2009年3月 (3)
2008年11月 (1)
2008年10月 (2)
2008年9月 (2)
2008年8月 (3)
2008年6月 (2)
2008年5月 (3)
2008年4月 (6)
2008年3月 (5)
2008年1月 (1)
2007年12月 (2)
2007年11月 (1)
2007年10月 (1)
2007年9月 (4)
最新评论
1. re: [原创]C#调用WMI更改本地网络IP设置
@Kingthy
谢谢 (wesleysun)
2. re: [原创]C#调用WMI更改本地网络IP设置
@wesleysun
上传了源码
(Kingthy)
3. re: [原创]C#调用WMI更改本地网络IP设置
错误 1 “SetIPAddress”方法没有采用“4”个参数的重载 C:\Documents and Settings\Administrator\My Documents\Visual Studi... (wesleysun)
4. re: [原创]C#调用WMI更改本地网络IP设置
怎么解决这个问题呢?
(wesleysun)
5. re: [原创]C#调用WMI更改本地网络IP设置
System.Management.ManagementBaseObject并不包含GetMethodParameters的定义
请问怎么会出现这种情况呢? (wesleysun)
阅读排行榜
1. 使用HTTP_X_FORWARDED_FOR获取客户端IP的严重后果(6140)
2. 163相册验证码图片的识别手记之一 --- 去除干扰(3236)
3. 使用Flash打造可定义界面风格的文件上传控件(3158)
4. 文件同步精灵(初版)-- 协议介绍(源码公开)(3095)
5. 开发基于UDP广播的小型局域网聊天室(2969)
评论排行榜
1. 163相册验证码图片的识别手记之一 --- 去除干扰(32)
2. 使用HTTP_X_FORWARDED_FOR获取客户端IP的严重后果(26)
3. 163相册验证码图片的识别手记之二 --- 识别 (19)
4. 使用Flash打造可定义界面风格的文件上传控件(17)
5. Visual Studio里的BUG??(17)