我想知道,因为没有办法在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框架管理这样的事情吗?
感谢你的回答,我花了半天的时间试图创造这样一个结构而没有任何成功,所以任何帮助都是值得赞赏的:)
答案 0 :(得分:4)
没有直接等效于此构造,因为C#不允许类型的基类是动态的。请记住,泛型类型必须在编译时完全定义,而不是在使用时。
有多种可能的方法:在上面的示例中,StinkingDog应该只实现IDogDecorator接口。所以只需指定那里。无论如何,你正在转发电话。
public class StinkingDog : Decorator<IDogDecorator>, IDogDecorator
可能会有一些框架可以完全按照您的要求执行(例如Rhino.Mocks实际上是以这种方式创建Mocks),但对于生产代码,我真的建议不要采用任何AOP方法。它笨拙而缓慢。