C#中的通用装饰器

时间:2013-10-22 12:48:43

标签: c# generics aop postsharp

我想知道,因为没有办法在C#中实现一个通用的Decorator类(是吗?),如下所示:

public class Decorator<TDecoratorIterface> : TDecoratorInterface 
{
    public TDecoratorInterface Component {get; private set;}

    protected Decorator(TDecoratorInterface component)
    {
        Component = component;
    }
}

像这样使用:

public interface IDogDecorator 
{
    void Bark();
}

public class Dog : IDogDecorator
{
    public void Bark()
    {
        Console.Write("I am a dog");
    }
}

public class StinkingDog : Decorator<IDogDecorator>
{
    public StinkingDog(IDogDecorator dog):base(dog)
    {
    }

    public void Bark()
    {
        Component.Bark();
        Console.WriteLine(" and I stink");
    }
}

可以通过PostSharp或任何其他.NET的AOP框架管理这样的事情吗?

感谢你的回答,我花了半天的时间试图创造这样一个结构而没有任何成功,所以任何帮助都是值得赞赏的:)

1 个答案:

答案 0 :(得分:4)

没有直接等效于此构造,因为C#不允许类型的基类是动态的。请记住,泛型类型必须在编译时完全定义,而不是在使用时。

有多种可能的方法:在上面的示例中,StinkingDog应该只实现IDogDecorator接口。所以只需指定那里。无论如何,你正在转发电话。

public class StinkingDog : Decorator<IDogDecorator>, IDogDecorator

可能会有一些框架可以完全按照您的要求执行(例如Rhino.Mocks实际上是以这种方式创建Mocks),但对于生产代码,我真的建议不要采用任何AOP方法。它笨拙而缓慢。