C#中如何通过字符串形式的特殊文件夹名获取对应路径?
解决动态转换特殊文件夹字符串为枚举的问题
你原来的代码出问题的核心原因很简单:Environment.SpecialFolder是枚举类型,它的成员是枚举常量,不是类的属性(Property),所以用GetProperty去查找肯定找不到对应的成员,自然就运行失败啦。
给你两种靠谱的解决方案,推荐用第二种做容错处理:
方案1:直接使用Enum.Parse(适合确定配置值绝对正确的场景)
先从配置文件读取字符串,再直接解析为枚举类型:
// 从App.Config读取配置值,假设你的配置键是"TargetSpecialFolder" string folderConfigValue = ConfigurationManager.AppSettings["TargetSpecialFolder"]; // 解析为枚举 Environment.SpecialFolder targetFolder = (Environment.SpecialFolder)Enum.Parse( typeof(Environment.SpecialFolder), folderConfigValue ); // 接下来就可以正常获取路径了 string folderPath = Environment.GetFolderPath(targetFolder);
方案2:用Enum.TryParse做容错(更推荐,适配配置可能出错的情况)
实际项目里配置文件可能被误改,所以用TryParse可以避免程序崩溃,还能处理异常情况:
string folderConfigValue = ConfigurationManager.AppSettings["TargetSpecialFolder"]; if (Enum.TryParse<Environment.SpecialFolder>(folderConfigValue, out var targetFolder)) { string folderPath = Environment.GetFolderPath(targetFolder); // 在这里使用获取到的路径执行你的业务逻辑 } else { // 配置值无效时的处理逻辑,比如给用户提示或者用默认文件夹 MessageBox.Show("配置文件中的特殊文件夹名称无效,将使用默认路径"); string defaultPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); // 使用默认路径继续操作 }
补充:为什么你的原代码不行?
如果非要用反射的方式(不推荐,没必要),你应该用GetField而不是GetProperty,因为枚举的成员是字段(Field):
object value = typeof(Environment.SpecialFolder).GetField(folderConfigValue).GetValue(null); Environment.SpecialFolder targetFolder = (Environment.SpecialFolder)value;
但显然枚举自带的解析方法更简洁、可读性更高,完全没必要用反射绕一圈。
内容的提问来源于stack exchange,提问作者Robertcode
相关产品推荐
相关产品推荐

