[英]Intercept Method/Property call in c#
在下面的代码中,我有一个Foo类,它由我的main方法调用(没有接口)。 该属性没有后备字段或设置器,而是调用了私有方法。 Foo不能更改,foo的用法也不能更改为IFoo接口。
-如何更改foo.FooValue的值?
-System.Reflection,System.Reflection.Emit,.NET标准库等(不安全代码等)中可以包含任何内容来更改返回值吗?
我很欣赏是否有某些东西一定是“邪恶的”,但我对“邪恶的”答案很感兴趣。
public class Program
{
public static void Main(){
Foo foo = new Foo();
int bar = foo.FooValue;
}
}
public class Foo{
public int FooValue
{
get
{
return this.FooMethod();
}
}
private int FooMethod
{
return 0;
}
}
相关问题:
如何在没有设置者的情况下设置财产的价值-相关但未得到解答 -也许答案是“否”,但我对最主要的答案并不信服,最主要的答案只是指出您无法通过更改(非-存在)支持字段。
C#中对属性get方法的拦截调用 -有趣。 不确定这是否是我的答案,如果不确定,则不确定如何在单元测试中使用它。
编辑:好的。 我将重新编写代码以使其更具可测试性。 但是,出于兴趣,有没有人成功地破解了这种情况?
您可以为Foo
创建一个可以被嘲笑的代理:
public class FooProxy : IFoo
{
private Foo _Foo;
public FooProxy(Foo foo)
{
_Foo = foo;
}
public int FooValue
{
get {return _Foo.FooValue();
}
}
public interface IFoo
{
public int FooValue {get;}
}
那么您可以使用DI来“注入” IFoo
,并使您的代码更具可测试性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.