C# 中的泛型装饰器

本文关键字:泛型 | 更新日期: 2023-09-27 18:36:33

我想知道,因为没有办法在 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框架来管理吗?

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

C# 中的泛型装饰器

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

有多种可能的方法:在上面的例子中,StinkingDog应该只实现IDogDecorator接口。所以只需在那里指定。无论如何,您都在转接呼叫。

public class StinkingDog : Decorator<IDogDecorator>, IDogDecorator

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