【问题标题】:readonly parameter with container Class (C#)带有容器类 (C#) 的只读参数
【发布时间】:2020-03-31 21:16:48
【问题描述】:

好吧,假设我有一个数据容器类

public class DataContainer {
      public Person person;
}

我们已经创建了这个类的一个实例

DataContainer dataContainer = new DataContainer();
dataContainer.Person = new Person("Smith");

我们尝试将它传递给我们希望能够只读取容器而不是修改的方法

public void ExampleMethod(in DataContainer dataContainer){
   dataConainer.Person.name = "blablabla" //we don't want to be able to do that
   dataContainer = new DataContainer(); // this is not possible because of in keyword
}

我尝试了 in 关键字,但它对禁止更改容器没有任何影响...

附: : 将容器转换为结构是没有解决办法的,因为它会变得不可变

【问题讨论】:

  • 这在 C# 中是不可能的。您不能让对象在某些上下文中显示为不可变,而在其他上下文中显示为可变。我建议将字段本身设为只读,通过其构造函数对其进行初始化,并在任何地方接受不可变语义。
  • 您可以创建两个接口:IImmutablePersonIMutablePerson(示例)并让您的 person 类实现两者。对于不应该进行更改的方法,请使用不可变合约。
  • @EtiennedeMartel 这里的问题是我希望其他类能够更改容器中的数据,所以只读字段听起来不太好......也许 getter 和 setter 可以做这项工作......是否有可能检测到谁在获得财产?限制从那里访问?

标签: c# reference readonly data-containers


【解决方案1】:

如果您不想修改 Person.Name,那么您可以简单地使用封装。

我会按以下方式设计 Person 类:

class Person
{
    public Person(string name)
    {
        Name = name;
    }

    public string Name { get; }
}

如果这没有帮助,那么我看到的唯一其他方法是将DTO 传递给ExampleMethod(可以使用Automapper 轻松创建)。

var dto = _mapper.Map<DataContainerDto>(dataContainer);
ExampleMethod(dto);

...

public void ExampleMethod(DataContainerDto dataContainer)
{
    // Nobody cares if I modify it,
    // because the original dataContainer reamains intact
    dataConainer.Person.name = "blablabla";
}

【讨论】:

  • 看起来不错!实际上也许是我正在寻找的......所以我要试一试!非常感谢!
猜你喜欢
  • 2023-03-09
  • 2014-06-29
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多