C#中如何通过List修改静态字符串变量?
问题描述
我定义了一些静态字符串:
static string Robocopy_Mirror = "[Robocopy_Mirror]"; static string Robocopy_Copy = "[Robocopy_Copy]"; static string Network_Path_1 = "[Network_Path_1]"; // \\NAS\Sync\ static string Lokal_Path_1 = "[Lokal_Path_1]"; // X:\Sync\
为精简代码,我将这些变量放入List并尝试通过循环修改值:
List<string> variableListe = new List<string>() { Robocopy_Mirror , Robocopy_Copy , Network_Path_1, Lokal_Path_1, File_Network_Sync_1, File_Lokal_Sync_1, File_Network_Sync_2, File_Lokal_Sync_2 };
但静态变量未被修改,测试代码如下:
for (int i = 0; i < variableListe.Count-1; i++) { variableListe[i] = AppConfig.ElementAt(configPathPosition); } Console.WriteLine(Robocopy_Mirror); // prints "[Robocopy_Mirror]" instead of like C:\robocopy
请问有没有快速修改这些静态变量的方法?
原因及解决方法
为什么List无法修改原静态变量
string是不可变引用类型,赋值时会创建副本存入List,而非存储原变量的引用。修改List中的元素只会改变副本值,原静态变量不会同步更新。
快速修改的方法
方法1:用委托列表存储赋值逻辑
把每个静态变量的赋值操作封装成委托,循环执行委托即可直接修改原变量:
// 定义委托列表,每个元素对应一个静态变量的赋值操作 List<Action<string>> setters = new List<Action<string>>() { val => Robocopy_Mirror = val, val => Robocopy_Copy = val, val => Network_Path_1 = val, val => Lokal_Path_1 = val, val => File_Network_Sync_1 = val, val => File_Lokal_Sync_1 = val, val => File_Network_Sync_2 = val, val => File_Lokal_Sync_2 = val }; // 循环执行委托,修改原静态变量 for (int i = 0; i < setters.Count; i++) { setters[i](AppConfig.ElementAt(configPathPosition + i)); }
方法2:反射批量修改
如果静态变量数量较多,可通过反射遍历并修改:
var type = typeof(YourClassName); // 替换为包含静态变量的类名 var fields = type.GetFields(BindingFlags.Static | BindingFlags.Public); // 注意要保证配置值顺序与变量顺序一致 for (int i = 0; i < fields.Length && i < AppConfig.Count(); i++) { fields[i].SetValue(null, AppConfig.ElementAt(configPathPosition + i)); }
提示:反射存在一定性能开销,且变量名或类名变更易引发错误,适合变量数量多且结构稳定的场景。
方法3:封装为静态类属性(推荐)
把配置项封装成静态类的属性,既便于维护,也能批量修改:
public static class AppSettings { public static string Robocopy_Mirror { get; set; } = "[Robocopy_Mirror]"; public static string Robocopy_Copy { get; set; } = "[Robocopy_Copy]"; public static string Network_Path_1 { get; set; } = "[Network_Path_1]"; // 添加其他配置项... } // 批量修改属性 var properties = typeof(AppSettings).GetProperties(BindingFlags.Static | BindingFlags.Public); for (int i = 0; i < properties.Length; i++) { properties[i].SetValue(null, AppConfig.ElementAt(configPathPosition + i)); }
内容的提问来源于stack exchange,提问作者StefanS
相关产品推荐
相关产品推荐

