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# 不允许类型的基类是动态的。请记住,泛型类型必须在编译时完全定义,而不是在使用时定义。
有多种可能的方法:在上面的例子中,StinkingDog应该只实现IDogDecorator接口。所以只需在那里指定。无论如何,您都在转接呼叫。
public class StinkingDog : Decorator<IDogDecorator>, IDogDecorator
可能会有一些框架完全按照你想要的方式做(即 Rhino.Mocks 实际上是以这种方式创建 Mocks),但对于生产代码,我真的建议不要做任何 AOP 方法。它笨拙而缓慢。