C#返回新对象时,如何依据其他属性值为属性赋值?
解决C#对象初始化器中无法引用同一对象其他属性的问题
针对你遇到的在对象初始化器里没法引用刚设置的Id属性的问题,有几种实用的解决方式:
1. 提前计算并存储Id值
最直接的方案是先把Id计算出来存到变量里,后续初始化属性时直接复用这个变量,避免重复调用GetCurrentId(ids):
public MyClass GetNewMyClassObject(List<int> ids) { var currentId = GetCurrentId(ids); return new MyClass { Id = currentId, Info = GetInfoFromId(currentId), Name = GetNameFromId(currentId) }; }
这种方式简单直观,还能避免多次调用GetCurrentId可能带来的性能问题或不一致结果(如果这个方法不是纯函数的话)。
2. 给MyClass添加构造函数
如果这类初始化逻辑比较常用,可以给MyClass添加一个接收Id的构造函数,在构造函数内部完成Info和Name的赋值:
public class MyClass { public int Id { get; set; } public string Info { get; set; } public string Name { get; set; } public MyClass(int id) { Id = id; Info = GetInfoFromId(id); Name = GetNameFromId(id); } // 保留无参构造函数(如果业务需要的话) public MyClass() {} }
之后业务方法里就可以直接这样调用:
public MyClass GetNewMyClassObject(List<int> ids) { var currentId = GetCurrentId(ids); return new MyClass(currentId); }
这种方式把属性初始化的逻辑封装到类内部,符合封装原则,适合需要多次创建这类对象的场景。
3. 先创建对象再分步赋值
如果不想提前存变量也不想修改类结构,可以先创建对象并设置Id,之后再给Info和Name赋值:
public MyClass GetNewMyClassObject(List<int> ids) { var myObj = new MyClass(); myObj.Id = GetCurrentId(ids); myObj.Info = GetInfoFromId(myObj.Id); myObj.Name = GetNameFromId(myObj.Id); return myObj; }
这种方式虽然代码稍显繁琐,但不需要额外的变量或修改类,适合临时场景。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

