[英]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.