3

我想知道,因为没有办法像这样在 C# 中实现一个通用的装饰器类(是吗?):

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 框架来管理吗?

感谢您的回答,我花了半天时间尝试创建这样的构造,但没有成功,因此感谢您的帮助:)

4

1 回答 1

4

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

有多种可能的方法:在上面的示例中,StinkingDog 应该只实现 IDogDecorator 接口。因此,只需在此处指定即可。反正你是在转接电话。

public class StinkingDog : Decorator<IDogDecorator>, IDogDecorator

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

于 2013-10-24T15:47:56.350 回答