параметр только для чтения с контейнером класса (C#) - PullRequest
0 голосов
/ 01 апреля 2020

Хорошо, допустим, у меня есть класс контейнера данных

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: преобразование контейнера в структуру - это не решение, потому что оно станет неизменным

1 Ответ

1 голос
/ 01 апреля 2020

Если вы не хотите изменять 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";
}
...