隐式转换可以“改变”其目标对象吗?

时间:2014-03-01 14:46:48

标签: c# implicit-conversion

我想在C#中找到一种隐式“输入”转换的方法,以便能够改变转换的目标对象,而不是用新对象替换它。

场景:我有一个包装类型ObservableValue,如下所示:

public struct ObservableValue
{
    public event EventHandler ValueChanged;

    public ObservableValue(int value)
    {
        mValue = value;

        // must initialize all members since this is a struct
        ValueChanged = null;
    }

    public int Value
    {
        get { return mValue; }
        set { if (mValue != value) { mValue = value; RaiseValueChanged(); } }
    }

    public static implicit operator T(ObservableValue value)
    {
        return value.mValue;
    }

    private RaiseValueChanged()
    {
        var handler = ValueChanged;
        if (handler != null) handler(this, EventArgs.Empty);
    }

    private int mValue;
}

正如您所看到的,该类支持隐式转换为其包装类型,因此我可以这样写:

ObservableValue myValue = new ObservableValue(6);
int result = myValue * 7; // 42

我还想允许隐式输入转换(从包装类型到包装器),以便我可以这样写:

myValue = 42;

所以我尝试了一个标准的隐式转换运算符:

public static implicit operator ObservableValue(int value)
{
    return new ObservableValue(value);
}

此处的问题是转化会创建新的ObservableValue,这意味着ValueChanged事件的所有订阅者现在都已丢失。 有没有办法支持隐式“输入”转换,以便保留现有对象状态?

(这个“场景”可能看起来很奇怪,但我已经明显剥离了它。真正的场景更复杂;关键是我的包装类有其他状态,当通过隐式分配对象时必须保留转换。)

0 个答案:

没有答案