我正在寻找一种允许C#对象中的属性只设置一次的方法.编写代码来实现这一点很容易,但我宁愿使用标准机制(如果存在的话).
public OneShot<int> SetOnceProperty { get; set; }
我想做的是,如果尚未设置属性,则可以设置该属性,但如果之前已设置,则抛出异常.它的功能应该像一个可为空的值,我可以判断它是否已设置.
我正在寻找一种允许C#对象中的属性只设置一次的方法.编写代码来实现这一点很容易,但我宁愿使用标准机制(如果存在的话).
public OneShot<int> SetOnceProperty { get; set; }
我想做的是,如果尚未设置属性,则可以设置该属性,但如果之前已设置,则抛出异常.它的功能应该像一个可为空的值,我可以判断它是否已设置.
中国的TPL对此有直接支持.净4.0;
(编辑:上面这句话是在当时可用的"预览"比特中预计有System.Threading.WriteOnce<T>
个比特的情况下写的,但这似乎在TPL达到RTM/GA之前就消失了)
在那之前,你自己判断就行了……据我记忆所及,台词不多.
比如:
public sealed class WriteOnce<T>
{
private T value;
private bool hasValue;
public override string ToString()
{
return hasValue ? Convert.ToString(value) : "";
}
public T Value
{
get
{
if (!hasValue) throw new InvalidOperationException("Value not set");
return value;
}
set
{
if (hasValue) throw new InvalidOperationException("Value already set");
this.value = value;
this.hasValue = true;
}
}
public T ValueOrDefault { get { return value; } }
public static implicit operator T(WriteOnce<T> value) { return value.Value; }
}
然后使用,例如:
readonly WriteOnce<string> name = new WriteOnce<string>();
public WriteOnce<string> Name { get { return name; } }