在一个命令中更改对象的多个属性

Ins*_*Man 2 c#

这是一个具有三个属性的对象:

public class myClass
{
   public int score { get; set; }
   public string name { get; set; }
   public bool isAlive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在创建了这个类的实例之后,在某些地方,我正在改变这个实例的两个或三个属性,如下所示:

targetInstance.score = 1;
targetInstance.name = "John";
targetInstance.isAlive = true;
Run Code Online (Sandbox Code Playgroud)

有没有办法使用targetInstance一次然后在某种程度上使用一些括号只是设置属性(如初始化),类似于这样:

targetInstance = { score = 1, name = "John" }
Run Code Online (Sandbox Code Playgroud)

注意:也许你建议有一个方法来获取这些并改变属性,但是当有这么多属性时它不适合.

Iva*_*oev 5

最接近的是使用 C# 7元组解构语法:

(targetInstance.score, targetInstance.name, targetInstance.isAlive) = (1, "John", true);
Run Code Online (Sandbox Code Playgroud)

但它仍然需要重复目标变量名称,因此 Daniel Hilgarth 的答案是正确的。

  • 他不想多次写入 `targetInstance.` (2认同)

Joh*_* Wu 5

命名参数

您可以使用命名的默认参数编写方法,并使用命名参数来仅更新所需的参数.

例如:

public class myClass
{
   public int score { get; set; }
   public string name { get; set; }
   public bool isAlive { get; set; }

   public void Set(int score = -1, string name = null, bool? isAlive = null)
   {
       if (score != -1) this.score = score;
       if (name != null) this.name = name;
       if (isAlive.HasValue) this.isAlive = isAlive.Value;
   }
}
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼它:

var o = new myClass();
o.Set(name: "Hello");
Run Code Online (Sandbox Code Playgroud)

要么

var o = new myClass();
o.Set(name: "Hello", isValid: false);
Run Code Online (Sandbox Code Playgroud)

要么

var o = new myClass();
o.Set(score: 100, isValid: false);
Run Code Online (Sandbox Code Playgroud)

流利的语法

您可以创建一组可链接的"setter方法",如下所示:

public class myClass
{
   public int score { get; set; }
   public string name { get; set; }
   public bool isAlive { get; set; }

   public myClass SetScore(int score)
   {
       this.score = score;
       return this;
   }

   public myClass SetName(string name)
   {
       this.name = name;
       return this;
   }

   public myClass SetIsAlive(bool isAlive)
   {
       this.isAlive = isAlive;
       return this;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

var o = new myClass();
o.SetName("Donald").SetIsAlive(true);
Run Code Online (Sandbox Code Playgroud)

或者像这样:

var o = new myClass()
    .SetName("Bob")
    .SetScore(0)
    .SetIsAlive(true);
Run Code Online (Sandbox Code Playgroud)