我有一个枚举DoStuff
的课程,其值为before
,after
或none
。这些名称不是真正的名字,但它得到了重点。该类有一个方法foo
。
以下是一组不同类型的只读属性,每个属性如下所示:
public [type] MyProperty {
get {
if(enumValue == DoStuff.Before)
foo();
[type] result = //Do calculations here
if(enumValue == DoStuff.After)
foo();
return result;
}
}
有没有办法抽象出这些前/后计算调用?我现在可以想到两个解决方案:
创建一个接受委托的私有方法,并在适当的位置调用foo
。由于平台上缺乏泛型,我正在写这个。
使用包装器调用创建一个不可实例化的基类,并派生一个访问基类属性的Before和After子类,并在适当的位置调用
这种结构是否有众所周知的模式?
答案 0 :(得分:1)
使用以下语法创建方法:
delegate void Handler();
void DoHandler(Handler handler)
{
if(enumValue == DoStuff.Before)
foo();
handler();
if(enumValue == DoStuff.After)
foo();
}
然后在你的财产
public [type] MyProperty
{
get
{
[type] result = default(type);
DoHandler(() =>
{
int a = 5;
int b = 6;
result = a + b;
});
return result;
}
}
答案 1 :(得分:0)
我倾向于在适当的地方创建一个Before and After事件/委托和slap foo(),可能就在你现在设置enumValue的任何地方。然后致电:
get {
BeforeDelegate();
// Do calcs
AfterDelegate();
}
实际用途是什么?你为什么需要这种模式?
旁注:如果我有一个getter做这种逻辑,我更有可能把它放在一个方法中。它不太可能让人们大吃一惊。方法暗示我可能在引擎盖下做了一些事情来获得你所要求的价值,而不仅仅是暴露一个标量值。
答案 2 :(得分:0)
我认为最好将枚举值放在一个单独的类中,该类具有一个名为EnamumValue的属性和事件BEfore和After,并在使用enamvalue类的类中处理此事件, 当enumvalue改变了适当的事件
public class EnumValueClass
{
public event BeforeDelegate OnBefore();
public event AfterDelegate OnAfter();
private EnumType enumValue;
public EnumType EnumValue
{
get {
return enumValue;
}
set{
this.enumValue = value;
if(enumValue == DoStuff.Before)
if(OnBefore!=null)
OnBefore();
if(enumValue == DoStuff.After)
if(OnAfter!=null)
OnAfter();
}
}
}