代码块的包装器

时间:2011-02-18 13:55:38

标签: c# wrapping action

例如,我有一个数据网格,并希望在数据绑定之前和数据绑定之后对它做一些事情,如下所示:

dgvTasksDocList.SaveLayoutToFile();
sTATUSCHANGESEXTENDEDBindingSource.DataSource = dt;
dgvTasksDocList.RestoreLayoutFromFile();

我希望在绑定某些源时添加所有这些代码。有没有一种简单的方法可以在某些操作之前/之后编写这样的代码(当然我可以添加这两行,但可能有一些已知的方法来做这些事情)?

3 个答案:

答案 0 :(得分:0)

似乎是AOP的案例 - http://en.wikipedia.org/wiki/Aspect-oriented_programming

例如,使用PostSharp,您将能够创建属性PersistLayout并将其应用为:

[PersistLayout]
public void BindDataSource(object dt)
{
    sTATUSCHANGESEXTENDEDBindingSource.DataSource = dt;
}

然后Postsharp将在编译时扩展源代码以调用您的其他两行。

其他想法可能是在sTATUSCHANGESEXTENDEDBindingSource.DataSource属性设置器中调用这两个方法,但这个决定需要更多的上下文来知道。

答案 1 :(得分:0)

public class MyDGV : DataGridView
{
    public MyDGV()
    {
        DataSourceChanged += (s, e) => SaveLayoutToFile();
        DataBindingComplete += (s, e) => RestoreLayoutFromFile();
    }
}

答案 2 :(得分:0)

使用扩展方法制作它,现在它看起来像:

dgvTasksDocList.BindSourceAndSaveLayouts(sTATUSCHANGESEXTENDEDBindingSource, dt);

甚至:

dgvTasksDocList.BindSourceAndSaveLayouts(dt);

因为dgvTasksDocList.DataSource可以投放到BindingSource(确定我必须提供BindingSource