如何通过方法参数传递实现不同类静态字段的更新?
如何通过工具方法更新不同类的静态字段
你当前的代码无法实现静态字段更新,因为bool是值类型,传递给ToggleAbility的是字段值的副本,方法内修改副本不会影响原静态字段。以下是几种可行的解决方案:
方案1:使用委托(推荐,类型安全+高性能)
通过传递Action<bool>委托封装字段的赋值逻辑,工具方法执行委托即可直接修改原静态字段:
internal static class Hero1 { public static bool awesomeAbility = false; public static bool anotherAwesomeAbility = false; } internal static class Hero2 { public static bool awesomeAbility = false; public static bool anotherAwesomeAbility = false; } internal static class Utils { public static async void ToggleAbility(string abilityName, bool value, Action<bool> setter) { Logger.Write($"{abilityName} = {value}"); setter(value); } } // 使用示例 Utils.ToggleAbility(nameof(Hero1.awesomeAbility), true, val => Hero1.awesomeAbility = val); Utils.ToggleAbility(nameof(Hero2.anotherAwesomeAbility), false, val => Hero2.anotherAwesomeAbility = val);
这里用nameof获取字段名,避免硬编码字符串出错,同时委托直接绑定到原字段的赋值操作,确保修改生效。
方案2:使用反射(适合大量字段场景)
通过反射根据类型和字段名定位静态字段并修改,无需手动编写每个字段的赋值逻辑:
using System.Reflection; internal static class Hero1 { public static bool awesomeAbility = false; public static bool anotherAwesomeAbility = false; } internal static class Hero2 { public static bool awesomeAbility = false; public static bool anotherAwesomeAbility = false; } internal static class Utils { public static async void ToggleAbility(Type heroType, string abilityName, bool value) { var field = heroType.GetField(abilityName, BindingFlags.Public | BindingFlags.Static); if (field != null && field.FieldType == typeof(bool)) { Logger.Write($"{abilityName} = {value}"); field.SetValue(null, value); // 静态字段的实例参数传null } else { Logger.Write($"未找到目标字段:{heroType.FullName}.{abilityName}"); } } } // 使用示例 Utils.ToggleAbility(typeof(Hero1), nameof(Hero1.awesomeAbility), true); Utils.ToggleAbility(typeof(Hero2), nameof(Hero2.anotherAwesomeAbility), false);
注意:反射存在一定性能开销,且编译时无法检查字段是否存在,需要额外做空值和类型校验。
方案3:封装为属性(规范代码结构)
如果可以修改Hero类的代码,建议把静态字段封装为属性,后续扩展逻辑(如赋值验证、状态通知)会更方便:
internal static class Hero1 { public static bool AwesomeAbility { get; set; } = false; public static bool AnotherAwesomeAbility { get; set; } = false; } internal static class Hero2 { public static bool AwesomeAbility { get; set; } = false; public static bool AnotherAwesomeAbility { get; set; } = false; } internal static class Utils { public static async void ToggleAbility(string abilityName, bool value, Action<bool> setter) { Logger.Write($"{abilityName} = {value}"); setter(value); } } // 使用示例 Utils.ToggleAbility(nameof(Hero1.AwesomeAbility), true, val => Hero1.AwesomeAbility = val); Utils.ToggleAbility(nameof(Hero2.AnotherAwesomeAbility), false, val => Hero2.AnotherAwesomeAbility = val);
总结
- 优先选择委托方案,兼顾类型安全和性能;
- 字段数量极多时可考虑反射方案,但需权衡性能和编译时检查的缺失;
- 若能修改Hero类,封装属性是更规范的长期方案。
内容的提问来源于stack exchange,提问作者user999666
相关产品推荐
相关产品推荐

