带有容器 Class 的只读参数 (C#)
readonly parameter with container Class (C#)
好的,假设我有一个数据容器 class
public class DataContainer {
public Person person;
}
并且我们已经创建了这个 class
的一个实例
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 关键字,但它对禁止更改容器没有任何影响...
P.S。 : 将容器转换为结构不是解决方案,因为它将变得不可变
如果你不想修改Person.Name,那么你可以简单地使用封装。
我会按以下方式设计人物 class:
class Person
{
public Person(string name)
{
Name = name;
}
public string Name { get; }
}
如果这没有帮助,那么我看到的唯一其他方法是传递 DTO to ExampleMethod
(which can be easily created using 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";
}
好的,假设我有一个数据容器 class
public class DataContainer {
public Person person;
}
并且我们已经创建了这个 class
的一个实例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 关键字,但它对禁止更改容器没有任何影响...
P.S。 : 将容器转换为结构不是解决方案,因为它将变得不可变
如果你不想修改Person.Name,那么你可以简单地使用封装。
我会按以下方式设计人物 class:
class Person
{
public Person(string name)
{
Name = name;
}
public string Name { get; }
}
如果这没有帮助,那么我看到的唯一其他方法是传递 DTO to ExampleMethod
(which can be easily created using 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";
}