有没有更好的方法来编写这段代码?

时间:2011-06-10 20:28:57

标签: c# delegates .net-micro-framework

我有一个枚举DoStuff的课程,其值为beforeafternone。这些名称不是真正的名字,但它得到了重点。该类有一个方法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子类,并在适当的位置调用

这种结构是否有众所周知的模式?

3 个答案:

答案 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();
        }


    }
}