在 C# 中的函数装饰器

24

有没有C#的函数修饰符与Python中的类似?感觉可以使用属性和反射框架来实现,但我不知道如何在运行时替换函数。

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

这种方法可以让我轻松地在多个函数的入口和出口添加常见任务。


哎呀,我本来希望编程语言中已经有相关的内置功能,但是从回答来看好像没有直接的方法可以不添加新框架地完成。我的项目非常小,所以这种方式可能过于复杂了。 - jtjin
3个回答

12

谢谢你提供关于AOP的指引 - 我认为在我的小项目中添加一个框架可能有点过度设计,至少对于我最初想要使用装饰器的目的来说是这样。不管怎样还是非常感谢 :) - jtjin

9
你可以使用Post Sharp来实现这一点。请查看演示视频以获取说明。

1
Post Sharp 看起来非常棒,但为我的小项目添加一个框架可能有些杀鸡焉用。无论如何还是谢谢 :D - jtjin
非常简单,只需添加一个引用并继承一个属性。 - Yuriy Faktorovich
在45天试用期之后,它的价格为329欧元。 - Magnus
@Magnus 这里有一个免费版本。 - Yuriy Faktorovich
确实,这只是稍微不太清晰的营销常见情况。 - Magnus
1
@Magnus说他们的营销很糟糕和混乱,似乎还是抬举了它。不过产品本身非常棒。 - Yuriy Faktorovich

4

你可以通过.NET框架中的“ContextBoundObject”来实现这一点。但是,它有些复杂,因为它基本上使用.NET远程处理基础结构来拦截方法调用。(如果您的调用在同一个应用程序域内但跨不同“上下文”,则运行时开销最小)。

所以,其他发帖者提到的方法更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接