我想在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
事件的所有订阅者现在都已丢失。 有没有办法支持隐式“输入”转换,以便保留现有对象状态?
(这个“场景”可能看起来很奇怪,但我已经明显剥离了它。真正的场景更复杂;关键是我的包装类有其他状态,当通过隐式分配对象时必须保留转换。)