如何在C#中条件性初始化var变量?
解决方法
匿名类型(就是你用new {}创建的对象)是不可变的——一旦初始化完成,就没法再添加或修改属性了,所以你直接想给bodyObj事后加属性是行不通的。给你几个可行的方案:
方案1:创建匿名类型时直接做条件初始化
如果只是要根据条件决定是否包含某个属性/设置属性值,直接在初始化的时候处理就行,var完全支持这种写法:
public async Task<MyObject> ManageObjectAsync(string actionparam, int objectid) { var bodyObj = actionparam == "enable" ? new { action = "enable" } : new {}; // 其他情况的默认匿名类型 // 后续使用bodyObj... }
如果有多个条件分支,也可以扩展成更复杂的逻辑:
var bodyObj = actionparam switch { "enable" => new { action = "enable" }, "disable" => new { action = "disable", reason = "user request" }, _ => new {} };
方案2:用ExpandoObject动态添加属性
如果需要在运行时动态添加多个属性,推荐用ExpandoObject,它允许你随时添加/修改属性,用var声明也没问题(操作属性时需结合dynamic):
public async Task<MyObject> ManageObjectAsync(string actionparam, int objectid) { var bodyObj = new ExpandoObject(); dynamic dynamicBody = bodyObj; if (actionparam == "enable") { dynamicBody.action = "enable"; } // 可继续添加其他条件逻辑 if (objectid > 100) { dynamicBody.priority = "high"; } // ExpandoObject兼容大多数序列化库,可直接用于接口调用等场景 return await SomeApiCallAsync(bodyObj); }
方案3:定义实体类(最规范的方式)
如果这个对象的属性有固定的组合,直接定义实体类更安全,能获得编译时检查:
public class BodyModel { public string Action { get; set; } // 按需添加其他属性 } public async Task<MyObject> ManageObjectAsync(string actionparam, int objectid) { var bodyObj = new BodyModel(); if (actionparam == "enable") { bodyObj.Action = "enable"; } // 其他属性设置逻辑... }
内容的提问来源于stack exchange,提问作者BlackCat
相关产品推荐
相关产品推荐

