gpt4 book ai didi

c# - 具有许多属性的类的装饰器模式

转载 作者:可可西里 更新时间:2023-11-01 08:45:06 25 4
gpt4 key购买 nike

我有这个简单的类:

public class DataBag
{
public string UserControl { get; set; }
public string LoadMethod { get; set; }
public dynamic Params { get; set; }
public int Height { get; set; }

public DataBag(string Control,
object vars, string lm)
{
UserControl = Control;
LoadMethod = lm;
Params = vars;
Height = 0;
}
}

然后我想为它创建一个装饰器,它会添加一堆它自己的属性。问题是提供对装饰属性的访问的最简洁优雅的方式是什么?

到目前为止,我有两个选择:要么我为 decorator 中的四个装饰属性中的每一个都提供一个 get-set 对(这看起来很乏味,而且基本上是我想避免的),或者我从 DynamicObject 继承 DataBag 然后以某种方式设法使用 TryGetMember 方法获取装饰属性(这是动态的,似乎不是正确的方法用 C# 做事)。

有什么建议吗?

最佳答案

在实现装饰器时,我通常会执行以下操作。首先 - 提取装饰对象的接口(interface)并使装饰对象实现该接口(interface):

public interface IDataBag
{
string UserControl { get; set; }
string LoadMethod { get; set; }
dynamic Params { get; set; }
int Height { get; set; }
}

下一步 - 创建一个装饰器,它将所有调用委托(delegate)给装饰对象(所有装饰器都将继承自该装饰器):

public class DataBagDecorator : IDataBag
{
private IDataBag _dataBag;

public DataBagDecorator(IDataBag dataBag)
{
_dataBag = dataBag;
}

public virtual string UserControl
{
get { return _dataBag.UserControl; }
set { _dataBag.UserControl = value; }
}

// other members
}

最后——创建装饰器:

public class FooDataBag : DataBagDecorator
{
public FooDataBag(IDataBag dataBag)
: base(dataBag) { }

public override string UserControl
{
// added behavior
get { return "Foo" + base.UserControl; }
set { base.UserControl = value; }
}

// you don't need to override other members
}

用法:

IDataBag dataBag = new FooDataBag(new DataBag());

关于c# - 具有许多属性的类的装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13980703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com