能否在对象初始化后使用大括号批量修改多个成员值?
关于C#对象批量修改成员的语法方案
C#本身没有你示例中那种直接通过myForm = { ... }来批量修改已有对象成员的语法,但有几种实用的替代方案可以实现类似的批量修改效果:
1. 使用with表达式(C# 9.0及以上)
这个语法会基于原有对象创建一个新的实例,复制原有成员的值,同时修改你指定的成员。适合不需要保留原对象引用的场景:
// 基于原实例创建新实例并修改指定成员 myForm = myForm with { Left = 123, Text = "foo", AllowDrop = false };
注意:这会生成新对象,原对象的引用会被替换,如果其他地方还持有原对象的引用,那些引用指向的实例不会被修改。
2. 自定义扩展方法实现批量修改
如果需要直接修改原有对象的成员,可以写一个扩展方法,用lambda包裹批量赋值逻辑,写法简洁且有编译时检查:
// 定义扩展方法 public static class FormExtensions { public static void Update(this Form form, Action<Form> updateAction) { updateAction(form); } } // 使用方式 myForm.Update(f => { f.Left = 123; f.Text = "foo"; f.AllowDrop = false; });
这种方式直接操作原有对象,不会创建新实例,完全符合你想批量修改已有对象的需求。
3. 反射配合匿名类型(不推荐)
可以通过反射读取匿名类型的属性值,再赋值给目标对象,但这种方式性能差,且没有编译时类型检查,容易出现错误,仅作为了解:
var updates = new { Left = 123, Text = "foo", AllowDrop = false }; foreach (var prop in updates.GetType().GetProperties()) { var targetProp = myForm.GetType().GetProperty(prop.Name); targetProp?.SetValue(myForm, prop.GetValue(updates)); }
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

