【问题标题】:Is possible to have List<T> property with get, which does not allow to add items to it directly? [duplicate]是否可以使用 get 具有 List<T> 属性,它不允许直接向其中添加项目? [复制]
【发布时间】:2022-01-25 04:47:06
【问题描述】:

我有以下课程

public class Workflow
{
    public List<IActivity> Activities { get; } = new List<IActivity>();
    public void Add(IActivity activity)
    {
        Activities.Add(activity);
    }
}

现在,想法是只能使用 Add 方法添加活动。但我还需要能够阅读它们,这样我才能执行它们。

现在看一下程序:

class Program
{
    static void Main(string[] args)
    {
        var workflow = new Workflow();

        //I want this to work and it works
        workflow.Add(new UploadVideoActivity());

        //I want this to not work, but it works.
        workflow.Activities.Add(new UploadVideoActivity());
        WorkflowEngine.Run(workflow);
    }
}

我是否能够创建List&lt;T&gt; 属性,允许我们仅使用方法向其中添加项目,但可以从类中读取?

【问题讨论】:

  • 推荐阅读:Guidelines for Collections。您可以维护一个本地(私有)List&lt;T&gt;,但公开一个您从该属性返回的ReadOnlyCollection&lt;t&gt;
  • 删除项目或替换项目怎么样?是否可以直接对列表进行其他类型的修改?

标签: c# properties


【解决方案1】:

您可以在内部使用List&lt;IActivity&gt;,但将其公开为IReadOnlyList&lt;IActivity&gt; 属性,因此无法从您的班级外部对其进行修改:

public class Workflow
{
    private readonly List<IActivity> activities = new();
    public IReadOnlyList<IActivity> Activities => activities;
    public void Add(IActivity activity)
    {
        activities.Add(activity);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    相关资源
    最近更新 更多