0

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

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 关键字,但它对禁止更改容器没有任何影响......

PS:将容器转换为结构是没有解决方案的,因为它将变得不可变

4

1 回答 1

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";
}
于 2020-03-31T21:28:40.900 回答