You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:58:35