繁体   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