Tag: 装饰器

在C#中实现方法装饰器

在python中可以实现function decorators来扩展函数和方法的行为。 特别是我正在将设备库从python迁移到C# 。 与设备的通信可能会产生错误,应该使用自定义exception重新启动。 在python我会这样写: @device_error_wrapper(“Device A”, “Error while setting output voltage.”) def set_voltage(self, voltage): “”” Safely set the output voltage of device. “”” self.__handle.write(“:source:voltage:level {0}”.format(voltage)) 此方法调用将扩展为 try: self.__handle.write(“:source:voltage:level {0}”.format(voltage)) except Error: raise DeviceError(“Error while setting output voltage.”, “DeviceA”) 使用此模式,您可以轻松地包装和扩展方法,而无需在每个方法中编写每个try-except子句。 是否可以使用C#实现类似的模式? 如果需要实现装饰器( device_error_wrapper ),请告诉我。

我可以使用装饰器模式来包装方法体吗?

我有一堆不同签名的方法。 这些方法与脆弱的数据连接交互,因此我们经常使用辅助类来执行重试/重新连接等。如下所示: MyHelper.PerformCall( () => { doStuffWithData(parameters…) }); 这工作正常,但它可以使代码有点混乱。 我更喜欢做的是装饰与数据连接交互的方法,如下所示: [InteractsWithData] protected string doStuffWithData(parameters…) { // do stuff… } 然后基本上,每当doStuffWithData ,该方法的主体将作为Action传递给MyHelper.PerformCall() 。 我该怎么做呢?

如何在C#中自动生成Decorator模式

我有一些接口,以及一个实现此接口的类,说: interface IMyInterface { void Func1(); void Func2(); } class Concrete : IMyInterface { public virtual void Func1() { //do something } public virtual void Func2() { //do something } } 现在,我想创建一个类,用一些特定的逻辑来装饰每个具体的类方法,在非生产环境中,在调用之前和之后执行。 class Decorator : Concrete { public override void Func1() { Pre(); base.Func1; Post(); } public override void Func2() { Pre(); base.Func2; Post(); } […]

使用多个装饰器为对象添加function?

我试图理解装饰器模式,从实例中我了解装饰器对象如何通过覆盖装饰对象的方法以及如何通过新方法实现添加其他function来在运行时扩展现有function。 我有点困惑的地方是使用多个装饰器以及如何访问扩展function。 通常,在查看装饰器模式的示例时,会显示如下所示: IBusinessObject businessObject = new MailDecorator( new SmsDecorator( new FaxDecorator( new BusinessObject() ) ) ); 想法是采取一个对象并动态添加邮件,短信和传真function。 现在,如果您想发送邮件,这是MailDecorator类提供的方法,您可以执行以下操作: If(businessObject is MailDecorator) { ((MailDecorator) businessObject).SendMail(); } 但是,如果您想要发送SMS或传真,就像在装饰器模式的正常实现中那样,您将无法访问装饰器引用的对象,这将无效。 这是装饰器模式的限制还是超出了你可以期望用这种模式实现的范围,还是我完全误解了这里的东西? 不同的模式会更合适吗? 标准定义 “动态地将附加职责附加到对象。 装饰器提供了一种灵活的替代子类,以扩展function“ 暗示这应该可以通过这种模式实现,但在一个对象上使用多个装饰器时似乎会崩溃。

装饰模式实现

尝试使用“Head First Design Patterns”一书(用Java编写)中的代码在C#中实现装饰器模式。 我刚刚开始使用C#,因此我仍然对语法不熟悉,所以我不确定为什么我不能让下面的注释代码行工作。 这是Decorator模式中的第一个抽象基类及其派生类: using System; public abstract class Beverage { private String m_description; // get a description of the beverage public virtual String Description { get { return m_description; } } // calculate cost of the beverage public abstract double Cost(); } // HouseBlend coffee implements Beverage public class HouseBlend : Beverage […]