反射,如何替换反射到得方法

leonbingo 2010-06-02 05:19:08
TypeMock中可以将一个类的方法替换掉,将返回值更改,或者设定抛出exception什么的,如下面的code一样

[TestMethod, Isolated]
public void SwapAllInstances_TwoFutureInstances_AllInstancesAreFakes()
{
var fake = Isolate.Fake.Instance<Product>();
Isolate.WhenCalled(()=> fake.CalculatePrice(0)).WillReturn(100);

// Here we are setting the same behavior on all instances.
// The behavior we set on fake will apply to all instances, so both product1 and product2 will have the same behavior.
Isolate.Swap.AllInstances<Product>().With(fake);

Product product1 = new Product();
Product product2 = new Product();

// Assert that the behavior applied to all instances.
Assert.AreEqual(100, product1.CalculatePrice(0));
Assert.AreEqual(100, product2.CalculatePrice(0));
}


上面的code里面就有可以控制Isolate.WhenCalled(()=> fake.CalculatePrice(0)).WillReturn(100);
输入为0的时候,会返回100

做过反射的人也都知道,可以将类中的Field通过SetValue给替换掉,但是方法应该怎么替换,请高手给出研究方向啊,MethodInfo里面是没有类似Set的方法的。
...全文
366 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
t20100504t 2010-06-03
  • 打赏
  • 举报
回复
帮顶啊 ,我也想知道,正在学习反射呢!!!
llddyy123wq 2010-06-03
  • 打赏
  • 举报
回复
感觉楼主的方法好暴力呀。学习了。
gomoku 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 leonbingo 的回复:]
我说的是Mock,... 将方法逻辑替换掉 ...
[/Quote]

有一些测试工具是可以做到这点,内部它们用了framework profiler API,是可以替换掉函数入口。
不过这已经不是从.NET内部作的反射了。

有更深的兴趣可以看Jay Hilyard的MSDN文章:
No Code Can Hide from the Profiling API in the .NET Framework 2.0

捷哥1999 2010-06-03
  • 打赏
  • 举报
回复
这个很暴力,类似于代码注入了!
估计你要动态编译技术,看看这两个对你是否有帮助?

Three Ways to Inject Your Code into Another Process
leonbingo 2010-06-03
  • 打赏
  • 举报
回复
我说的是Mock
通常在写单元测试的时候,要将数据库访问层,或者是service访问层给mock掉,当然,除了替换方法,还有很多其他的方式,我在上面给的就是一个工具TypeMock的编码,从功能上看,TypeMock可以将指定类中的指定方法给Mock掉,也就是说,我可以让这个方法返回什么值就返回什么值,这样,本来依赖于数据库访问的方法,可以在单元测试的时候按照输入参数而返回指定的值,这样说可明白,

我的问题是,是怎么样实现这种将一个指定类的指定方法Mock掉,让这个方法按照我想要的路径来运行,所以我说的是将方法逻辑替换掉,不要执行原有逻辑啊。
我姓区不姓区 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 leonbingo 的回复:]
假设,一个方法需要查询数据库并且返回数据库记录条数,我说的额替换就是,将方法内容替换,不执行原有逻辑,直接返回我所需要的值
[/Quote]
方法肯定是要有返回值的,不可能为方法“赋值”……
要替换方法,可以将方法做成虚方法,然后在子类重写,但我想你要的肯定不是这个效果……
既然不要方法执行原有逻辑,不调用不就好了……
你的应用场景详细是怎样的?
believe19881106 2010-06-02
  • 打赏
  • 举报
回复
这个还要好好 研究哈
leonbingo 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ojlovecd 的回复:]
啥叫方法怎么替换?给出的信息太少,看不懂你到底问的是啥……
[/Quote]

假设,一个方法需要查询数据库并且返回数据库记录条数,我说的额替换就是,将方法内容替换,不执行原有逻辑,直接返回我所需要的值
NewUser2008 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ojlovecd 的回复:]
啥叫方法怎么替换?给出的信息太少,看不懂你到底问的是啥……
[/Quote]

up
我姓区不姓区 2010-06-02
  • 打赏
  • 举报
回复
啥叫方法怎么替换?给出的信息太少,看不懂你到底问的是啥……
请叫我卷福 2010-06-02
  • 打赏
  • 举报
回复
up 别沉了。。。。
harderLi 2010-06-02
  • 打赏
  • 举报
回复
Isolate.WhenCalled(()=> fake.CalculatePrice(0)).WillReturn(100);
这个不是开启线程的吗
没做过反射 帮顶
leonbingo 2010-06-02
  • 打赏
  • 举报
回复
顶下,沉太快
皇城龙三 2010-06-02
  • 打赏
  • 举报
回复
顶一下,也想看看是怎么解决的。
huangmin3956 2010-06-02
  • 打赏
  • 举报
回复
没时间了
捷哥1999 2010-06-02
  • 打赏
  • 举报
回复
沙发没坐到,呵呵。
捷哥1999 2010-06-02
  • 打赏
  • 举报
回复
留个沙发,回来看帖。
兔子-顾问 2010-06-02
  • 打赏
  • 举报
回复
不懂,标记一下回头看。学习。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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