C#对象初始化器:从另一个属性设置属性

4

我有一个对象,在我的构造函数中,我添加了一个新的Guid作为Id。

public class MyObject
{
  public MyObject()
  {
    Id = Guid.NewGuid().ToString();
  }

  public String Id { get; set; }
  public String Test { get; set; }

}

我希望在对象初始化程序中实现类似的功能:

var obj = new MyObject
{
  Test = Id; // Get new GUID created in constructor
}

这是可行的吗?

2个回答

8

不可以这样做。你必须在另一个语句中设置它:

var obj = new MyObject();
obj.Test = obj.Id;

在对象初始化程序的右侧,属性只是一个普通表达式,并没有与正在初始化的对象固有的联系。
如果您经常需要对特定类型执行此操作,可以添加一个方法:
public MyObject CopyIdToTest()
{
    this.Test = Id;
    return this;
}

然后使用:

MyObject obj = new MyObject().CopyIdToTest();

或使用其他属性:
MyObject obj = new MyObject 
{
    // Set other properties here
}.CopyIdToTest();

1

不可以在初始化器内部访问对象的属性。初始化器只是一些语法糖,方便程序员使用。

考虑下面这种情况:

class Program
{
    static void Main()
    {
     var Id = "hello";
    var obj = new MyObject
        {
            Test = Id // Get new GUID created in constructor
        };
    }
}

你会分配的Id(如果你的想法是有效的,但它并不是)不一定是你将获得的Id

1
请注意,在初始化器的“属性设置”部分执行之前,构造函数已经完成。 - Jon Skeet
是的 - 我把初始化和构造混淆了。我会编辑以提高清晰度,谢谢。 - Reacher Gilt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接