我正在寻找一种允许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; } }

.net相关问答推荐

使用 Powershell TOM 在 SSAS 表格中创建分区

使用 PEM 文件创建 DSA 签名

如何正确使用await using语法?

既然 .NET 有一个垃圾收集器,为什么我们需要终结器/析构器/dispose-pattern?

在生产中使用实体框架(代码优先)迁移

为什么我得到 411 Length required 错误?

数据库架构更改后更新 LINQ to SQL 类的最佳方法

在 .NET (C#) 中本地存储数据的最佳方式

如何在 C# 中将 null 值设置为 int?

在 .NET 中计算目录大小的最佳方法是什么?

覆盖 ASP.NET MVC 中的授权属性

Find() 和 First() 抛出异常,如何改为返回 null?

在关闭警告中访问 foreach 变量

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

是 C# 中的 bool 读/写原子

ConfigurationManager.AppSettings - 如何修改和保存?

System.Array.CopyTo() 和 System.Array.Clone() 之间的区别

在 WPF 中设置 Tab 键顺序

检测到包降级警告(dotnet core,vs 2017)

在 try/catch/finally 中等待的一个很好的解决方案?