C#中的函数装饰器

24 投票
3 回答
6374 浏览
提问于 2025-04-15 14:08

有没有类似于Python中函数装饰器的C#用法?我觉得可以通过属性和反射框架来实现,但我找不到在运行时替换函数的方法。

Python装饰器通常是这样工作的:

class decorator(obj):
    def __init__(self, f):
        self.f = f
    def __call__(self, *args, **kwargs):
        print "Before"
        self.f()
        print "After"

@decorator
def func1():
    print "Function 1"

@decorator
def func2():
    print "Function 2"

调用func1和func2会得到

Before
Function 1
After
Before
Function 2
After

这个想法是,装饰器可以让我在多个函数的入口和出口轻松添加一些常见的任务。

3 个回答

4

你可以通过.NET框架中的“ContextBoundObject”来实现这个功能。 不过这个方法有点复杂,因为它实际上是利用了.NET的远程调用机制来拦截方法调用。如果你的调用是在同一个应用程序域内,但跨越了不同的“上下文”,那么运行时的开销是最小的。 所以,其他人提到的那些更好的方法可能更适合你。

9

你可以使用 Post Sharp 来实现这个功能。可以看看他们的演示视频,里面有详细的操作说明。

12

我实现这个的方式是通过一些叫做面向切面编程(AOP)的框架,比如Castle动态代理Spring.NET,甚至还有策略注入应用块

撰写回答