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

src*_*091 11 c# properties decorator

我有这个简单的课程:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

到目前为止,我有两个选择:要么我提供了一个get-set在装饰一对,每四个装饰性(至极似乎tideous和拗口,基本上这是我想避免的)或我继承DataBagDynamicObject,然后以某种方式管理使用获得装饰性TryGetMember方法(这是动态的,似乎不是在C#中做事的正确方法.

有什么建议?

Ser*_*kiy 8

实现装饰时,我通常会做以下.首先 - 提取装饰对象的界面,并使装饰对象实现该界面:

public interface IDataBag
{
    string UserControl { get; set; }
    string LoadMethod { get; set; }
    dynamic Params { get; set; }
    int Height { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

接下来 - 创建一个装饰器,它将所有调用委托给装饰对象(所有装饰器将从这个装饰器继承):

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
}
Run Code Online (Sandbox Code Playgroud)

最后 - 创建装饰器:

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
}
Run Code Online (Sandbox Code Playgroud)

用法:

IDataBag dataBag = new FooDataBag(new DataBag());
Run Code Online (Sandbox Code Playgroud)