C#中能否通过变量调用应用程序设置内的属性?
不用写繁琐的switch!动态调用Settings属性的两种方案
当然不用纠结于冗长的switch语句啦!你想要的通过变量名动态调用Properties.Settings.Default属性的需求,在C#里完全可以实现,下面给你分享两种实用的方案:
方案一:用反射实现动态调用
反射是C#里实现动态访问类型成员的常用方式,刚好能满足你的需求。通过获取Settings类型的PropertyInfo,就能根据拼接后的属性名拿到对应的值:
// 拼接出目标属性名 string targetPropertyName = name + "Description"; var settingsInstance = Properties.Settings.Default; // 获取对应的属性信息 var property = settingsInstance.GetType().GetProperty(targetPropertyName); if (property != null) { // 读取属性值并转换为字符串 Description = property.GetValue(settingsInstance) as string; } else { // 处理属性不存在的情况,比如设置默认值 Description = "暂无描述"; }
注意事项:
- 属性名要完全匹配(大小写敏感),不然会返回null哦
- 如果需要频繁调用这个逻辑,可以提前缓存
PropertyInfo对象,避免重复反射带来的性能损耗
方案二:强类型字典映射(更稳妥的替代方案)
如果你的Settings属性是编译时就固定的,那用字典做提前映射会更靠谱——既避免了反射的性能开销,还能在编译阶段就检查属性名的正确性,减少运行时错误:
// 可以在类初始化时创建一个静态字典,把name和对应的Settings属性关联起来 private static readonly Dictionary<string, string> _descriptionMap = new Dictionary<string, string> { { "name1", Properties.Settings.Default.name1Description }, { "name2", Properties.Settings.Default.name2Description }, { "name3", Properties.Settings.Default.name3Description }, // 把所有需要用到的name-属性映射都加进来 }; // 调用时直接从字典取值 if (_descriptionMap.TryGetValue(name, out var matchedDescription)) { Description = matchedDescription; } else { Description = "暂无描述"; }
这个方案的优势很明显:代码可读性更强,编译时就能发现拼写错误,运行时性能也比反射好。
怎么选?
- 如果你的Settings属性是运行时动态新增的,反射是唯一的选择
- 如果属性是编译时固定的,优先用字典映射方案,更安全高效
内容的提问来源于stack exchange,提问作者sublimeaces
相关产品推荐
相关产品推荐

