.NET 对消息拦截传递和Remoting机制熟悉(或AOP)的朋友看看。。。

hwj383 2010-05-13 11:22:08
现在想实现一个功能.
class A
{

[Att("xxx")]
publuc string B()
{
return yyyy;
}
}

现在我想对方法进行切入,控制方法的返回结果

在Att中根据相应规则是否满足,否则让B方法返回xxx,而不是yyyy
我现在能得到B方法的返回值,但是它是只读的不能修改,各位有撒好办法吗?

请看这篇blog:

其中这句。。。。Console.WriteLine(",返回结果为:" + back.ReturnValue.ToString());

如果back.ReturnValue能改或者其它方式能改,就可以做很多事情。。。。。
...全文
243 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jshi123 2010-05-14
  • 打赏
  • 举报
回复
可以用PostSharp来实现,非常简单
首先写一个自定义标签,注意这个标签是以PostSharp.Aspects.OnMethodBoundaryAspect为基类的

[Serializable]
public class OverwriteResultAttribute : OnMethodBoundaryAspect
{
public override void OnExit(MethodExecutionArgs args)
{
args.ReturnValue = "zzzzzz!!!"; // 把返回值改掉
}
}

然后把这个标签贴到要篡改的方法上

class A
{
[OverwriteResult]
public string B()
{
return "yyyy";
}
}

测试一下,会看到输出的是zzzzzz!!!

A a = new A();
Response.Write(a.B());
「已注销」 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 jshi123 的回复:]
你不是要改返回值吗?你trace它干什么
[/Quote]

肯定是我没有配置正确,我在官网上又发现了些信息。。。
jshi123 2010-05-14
  • 打赏
  • 举报
回复
你不是要改返回值吗?你trace它干什么
「已注销」 2010-05-14
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PostSharp.Aspects;
using System.Diagnostics;

namespace Test
{
class Program
{
static void Main(string[] args)
{
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
SayHello();
SayGoodBye();
Console.ReadLine();
}

[Trace("MyCategory")]
private static void SayHello()
{
Console.WriteLine("Hello, world.");
}

[Trace("MyCategory")]
private static void SayGoodBye()
{
Console.WriteLine("Good bye, world.");
}

}

[Serializable]
public sealed class TraceAttribute : OnMethodBoundaryAspect
{
private string category;
public TraceAttribute(string category)
{
this.category = category;
}

public override void OnEntry(MethodExecutionArgs args)
{
Trace.WriteLine(string.Format("Entering {0}.{1}.",
args.Method.DeclaringType.Name, args.Method.Name), this.category);
}

public override void OnExit(MethodExecutionArgs args)
{
Trace.WriteLine(string.Format("Leaving {0}.{1}.",
args.Method.DeclaringType.Name, args.Method.Name), this.category);
}
}
}



来自官方:仍然无效果:See
jshi123 2010-05-14
  • 打赏
  • 举报
回复
你怎么写的?
「已注销」 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jshi123 的回复:]
可以用PostSharp来实现,非常简单
首先写一个自定义标签,注意这个标签是以PostSharp.Aspects.OnMethodBoundaryAspect为基类的

C# code

[Serializable]
public class OverwriteResultAttribute : OnMethodBoundaryAspect
{
public overri……
[/Quote]

结果似乎并不是像你说的那样?是我写错了?
jshi123 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hwj383 的回复:]
看了下,好像没有源代码下载,不知道性能怎样,试试....
[/Quote]
对的, PostSharp原来是开源的,1.5.7以后就商用了,不过现在还有源码下,不知道以后会不会收掉,赶紧去下吧
http://www.sharpcrafters.com/downloads/postsharp-1.5/sp-1
至于性能,PostSharp用的是IL-Weaving方式,在编译后直接在IL代码中插入Aspect代码,所以性能比一般用反射方式的方案肯定要高
zhxingway 2010-05-14
  • 打赏
  • 举报
回复


最近在学WCF,一起努力哦.
parverxiao 2010-05-14
  • 打赏
  • 举报
回复
不是很懂,帮顶。。。
myhope88 2010-05-14
  • 打赏
  • 举报
回复
路过,帮顶下
「已注销」 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jshi123 的回复:]
可以用PostSharp来实现,非常简单
首先写一个自定义标签,注意这个标签是以PostSharp.Aspects.OnMethodBoundaryAspect为基类的

C# code

[Serializable]
public class OverwriteResultAttribute : OnMethodBoundaryAspect
{
public overri……
[/Quote]

看了下,好像没有源代码下载,不知道性能怎样,试试....
qiqishardgel 2010-05-14
  • 打赏
  • 举报
回复
不是很清楚,帮顶!
linkinwhite 2010-05-13
  • 打赏
  • 举报
回复
太高深了,看不懂
你应该直接给博主发邮件......
x276912757 2010-05-13
  • 打赏
  • 举报
回复
帮顶!!!!!!!!!
「已注销」 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hwj383 的回复:]
引用 2 楼 linkinwhite 的回复:
太高深了,看不懂
你应该直接给博主发邮件......


对也,这是个办法哈/////
[/Quote]

但是博主找不到人了。。。。。
悔说话的哑巴 2010-05-13
  • 打赏
  • 举报
回复
按照你说的那样估计很难
「已注销」 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 linkinwhite 的回复:]
太高深了,看不懂
你应该直接给博主发邮件......
[/Quote]

对也,这是个办法哈/////
QQ865926998 2010-05-13
  • 打赏
  • 举报
回复
重写可以不

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧