1

也许有替代策略,但我有一个允许设置许多值的设置应用程序。我在想,如果每种类型的控件(文本框、复选框、组合框、datagridivew)都有一个 IsDirty 标志,该标志在用户编辑值时设置。

自然地,我可以将每个都包装在用户控件中,但我想知道是否有一种类似于扩展方法或类似方法的方法来避免必须为每个控件创建用户控件。

有什么想法吗?

谢谢马特

4

2 回答 2

4

查看 .NET 的ConditionalWeakTable,它旨在用于向对象“添加”属性。这可以有效地与扩展方法一起使用:

public static class DirtyExtensions {
    private class ExtraPropertyHolder {
        public bool IsDirty { get; set; }
    }

    private static readonly ConditionalWeakTable<Control, ExtraPropertyHolder> _isDirtyTable 
        = new ConditionalWeakTable<Control, ExtraPropertyHolder>();    

    public static bool IsDirty(this Control @this) {
        return _isDirtyTable.GetOrCreateValue(@this).IsDirty;
    }

    public static void SetIsDirty(this Control @this, bool isDirty) {
        _isDirtyTable.GetOrCreateValue(@this).IsDirty = value;
    }
}

使用 ConditionalWeakTable 的最大好处是它避免了在正确处理线程安全和垃圾收集(通过弱引用)时必须使用 UserControl 包装每个 .NET 类。

于 2012-10-02T00:32:25.640 回答
2

听起来您在 WinForm 领域,因此自定义扩展程序提供程序示例实现)可能在这些场景中运行良好。基本上,您在从 Control 对象派生的对象上添加属性(并在设置属性时处理行为) - 这就是所有控件。

于 2012-10-02T00:42:50.383 回答