【问题标题】:C#: Wrapping methods in other methodsC#:在其他方法中包装方法
【发布时间】:2011-06-19 13:59:58
【问题描述】:

有没有办法在 C# 中透明地包装其他方法中的方法?我想实现 Moose 的周边功能:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiers

编辑:透明是指不修改原始方法。

【问题讨论】:

  • 你可能可以通过一些漂亮的反思,但我不认为它会很漂亮......

标签: c# perl moose aop


【解决方案1】:

【讨论】:

  • 关闭。但是我需要在不重写原始方法的情况下这样做。这就是我所说的透明。虽然,这很整洁:)
【解决方案2】:

不,不是 Moose 中的做法。您可能想查看一些 AOP 库。

【讨论】:

    【解决方案3】:

    您可以通过使用动态代理来实现相同的效果。一个例子是Castle Dynamic Proxy

    此类框架利用 C# 反射工具来构造“代理”或“包装器”类。所以记住这一点。因此存在一定的开销。或者,您可以使用可以create classes statically via code generation 的框架。

    【讨论】:

      【解决方案4】:

      一些隔离库实现了允许用“detours”或模拟方法替换对方法的调用的功能。您也许可以使用相同的功能来实现您所指的拦截。有关详细信息,请检查以下内容:

      Rhino Mocks stubs and mocks are only good for interfaces?

      http://research.microsoft.com/en-us/projects/moles/

      http://www.typemock.com/typemock-isolator-product3/

      【讨论】:

        【解决方案5】:

        我认为您正在寻找所谓的面向方面编程。有许多 C# 库可以帮助解决这个问题。一种称为PostSharp(PostSharp 的免费版本支持此功能)。这是一个类似于驼鹿示例的示例。这将创建一个跟踪属性,您可以在其他方法上使用它来添加这个额外的功能:

        [Serializable]
        public class TraceAttribute : OnMethodBoundaryAspect
        {
        
            public override void OnEntry( MethodExecutionArgs args )
            {
                Trace.WriteLine("about to call method");
            }
        
            public override void OnExit(MethodExecutionArgs args) 
            { 
               Trace.WriteLine("just finished calling method"); 
            }
         }
        

        您可以通过在其前面放置 Trace 属性将其添加到方法“Foo”:

        [Trace]
        public void Foo() { /* ... */ }
        

        现在当 Foo 执行时,上面的 OnEntry 方法将在它之前运行,而 OnExit 将在它之后运行。

        【讨论】:

        • 我可以修改传递给函数的参数吗?我看到我收到了它们,但我无法从文档中判断我是否可以更改它们。
        • @rpkelly - 你希望对这些论点做什么?
        • 嗯,我需要记录对函数的调用及其返回值,以及处理传递给函数的“事务 id”的自动生成(当前在其他地方生成)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多