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和拗口,基本上这是我想避免的)或我继承DataBag
的DynamicObject
,然后以某种方式管理使用获得装饰性TryGetMember
方法(这是动态的,似乎不是在C#中做事的正确方法.
有什么建议?
实现装饰时,我通常会做以下.首先 - 提取装饰对象的界面,并使装饰对象实现该界面:
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)