c# - 处理稍后可能不存在的属性的最佳方法
问题描述
我正在开发一个应用程序,在我的一个静态类中,我有一些属性将是一些漫游目录的文件路径。
有可能appdata目录已被清除,因此漫游目录消失了,所以我会得到一个错误:
System.Initialization.TypeException
由于目录不存在。我在类中有方法,一旦发现它们不存在,它们将重新创建 appdata 目录。唯一的问题是我最初不知道如何绕过 System.Initialization.TypeException,然后使用我编写的方法创建指定的目录并使用新值更新属性。我一直在兜圈子,没有得到任何东西。目前,属性声明如下:
private static string appRoaming { get; } = $@"{EnvironManager.appData}\App Specific";
private static string sysPattern { get; } = "sys*";
private static string appSysDir { get; } = FileSystem.GetSubdirFromPattern(appRoaming, sysPattern);
本质上,appSysDir 将不起作用,因为 FileSystem.GetSubdirFromPattern 将找不到 appRoaming 目录。
任何和所有的见解将不胜感激。
解决方案
@Athanasios Kataras 建议的方法GetAppSysDir()
可以很好地完成工作,并且会在每次调用时被get
调用。
如果您希望 appSysDir 只初始化一次,您可以在初始化时调用相同的方法,例如
private static string appSysDir { get; } = GetAppSysDir(appRoaming, sysPattern);
这将起作用并且不会导致 a TypeException
,因为原始DirectoryNotFoundException
将在catch
块中处理。
就个人而言,我不喜欢在类型初始化上做冗长或复杂的工作。这取决于情况,什么太冗长或太复杂。
您可以向get => delegate
@Athanasios 提出的解决方案添加一些初始化处理,例如
if (!isAppSysDirInitialized)
{
// Do appSysDir initialization here.
// After initialization:
isAppSysDirInitialized = true;
}
else
{
return appSysDir;
}
这种方式将两者结合起来,在 Type 初始化器和单个 init 中没有做太多工作。
推荐阅读
- node.js - Homebridge如何在函数中调用服务函数?
- javascript - jasmine-node 看不到测试
- android - 切换片段时 ItemTouchHelper 手势后崩溃
- angularjs - angularjs中的checkAll复选框不起作用
- laravel - 如何在 Laravel 单元测试中模拟多对多关系
- python - 如何仅提取文件名?
- java - Java Optional 接口:Optional 对象链上的嵌套条件
- c# - 在字符串中定义的我的类名的实例列表
- react-native - 在 webview react_native 中处理单击按钮或取消划线文本
- c++ - QML 参考错误 -
在 c++/QML 集成期间未定义