C#在命中属性之前运行一段代码

时间:2010-12-30 18:13:01

标签: c#

我有一个方法,我希望始终在属性的get访问器之前运行。如果不在get {}中手动运行方法,这是否可行?这是我想要工作的一个例子。

    private string _someString;
    private string _someOtherString;

    public string SomeString
    {
        get { return _someString; }
    }

    public string SomeOtherString
    {
        get { return _someOtherString; }
    }

    public void AlwaysRun()
    {
        // Code to always run here.
    }

3 个答案:

答案 0 :(得分:5)

这在.NET框架中本身是不可能的。

但是可以使用称为AOP,面向方面编程的技术来完成。这里有一个很好的解释:http://www.sharpcrafters.com/aop.net。 AOP就是在方法调用之前或之后注入代码;这是你想要做的。有两种方法可以执行此操作:在运行时或编译时。运行时方式通过覆盖虚方法动态生成实现,因此它需要您的方法是虚拟的。如果编译时间,则修改实际代码(或IL)。

一个很好的编译时间AOP框架是PostSharp。对于运行时AOP,框架的示例可以是Castle DynamicProxy

答案 1 :(得分:1)

如果属性是虚拟的,则可以使用动态代理执行此操作。动态代理将覆盖getter和setter,在调用它们时通知您,然后运行原始方法。否则,手动将呼叫复制粘贴到任何地方。

答案 2 :(得分:0)

您可以使用依赖注入框架,例如Unity,Ninject,Castle Windsor,并实现拦截器。拦截器的工作是拦截对诸如方法之类的东西的调用,并对其进行一些操作,例如记录。

fejesjoco提到了动态代理,Castle Windsor也使用它们来拦截方法调用。

对于这种格式来说,这是一个很大的话题,但如果你有兴趣那么google ninject拦截并按照教程进行操作。这就是将大型软件系统整合在一起以实现灵活性并为未来变化提供支持的方式。