是否可以编写一个C#模板类<t>,可以在T有效的任何上下文中替换?</t>

时间:2013-11-03 11:38:40

标签: c#

我写了ObservableValue<T>来为值类型实现INotifyPropertyChanged,作为对.NET类ObservableCollection<T>的补充。

class ObservableValue<T> : INotifyPropertyChanged {
    private T value;
    private PropertyChangedEventHandler eh;

    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged {
        add { eh += value; }
        remove { eh -= value; }
    }

    public T Value {
        get { return value; }
        set {
            this.value = value;
            OnPropertyChanged();
        }
    }

    void OnPropertyChanged() {
        if (eh != null)
            eh(this, new PropertyChangedEventArgs("Value"));
    }
}

但是,要使用此类,必须绑定到ObservableValue<T>.Value而不是ObservableValue<T>。是否可以编写一些魔术代码以使ObservableValue<T>能够在T有效的任何环境中使用?

1 个答案:

答案 0 :(得分:1)

不,不可能为任何上下文执行此操作:具体而言,无法将其设置为ObservableValue<T>传递给ref的方法或out类型的T参数。

但是,您可以通过从ObservableValue<T>T定义隐式conversion operator,让用户将ObservableValue<T>的实例传递给采用{{{ 1}}按值,或将T分配给ObservableValue<T>类型的变量,而不明确引用T

.Value

当然,在预期public static implicit operator T(ObservableValue<T> ot) { return ot.Value; } 的上下文中使用ObservableValue<T>时,它会丢失其可观察行为:不会触发任何事件,并且原始T对象不会修改。