簡體   English   中英

C#中的攔截方法/屬性調用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM