处理稍后可能不存在的属性的最佳方式



我正在开发一个应用程序,在我的一个静态类中,我有一些属性,这些属性将是一些漫游目录的文件路径。

有一种可能性是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目录。

任何见解都将不胜感激。

检查表达式体成员

示例:

public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}

在您的情况下:

private static string GetAppSysDir() {
try {
return FileSystem.GetSubdirFromPattern(appRoaming, sysPattern);
} catch (Exception ex) {
// handle your exception
// return some kind of string
}
}
private static string appSysDir { get; } => GetAppSysDir;

@Athanasios-Kataras建议的方法GetAppSysDir()将很好地完成工作,并且将在每次get调用时调用。

如果您希望appSysDir只初始化一次,您可以在初始化时调用相同的方法,如

private static string appSysDir { get; } = GetAppSysDir(appRoaming, sysPattern);

这将起作用,并且不会导致TypeException,因为始发DirectoryNotFoundException将在catch块中处理。

就我个人而言,我不喜欢在类型初始化上运行冗长或复杂的工作。这取决于情况,什么太长或太复杂。

您可以在@Athanasios提出的get => delegate解决方案中添加一些初始化处理,如

if (!isAppSysDirInitialized) 
{
// Do appSysDir initialization here.
// After initialization:
isAppSysDirInitialized = true;
} 
else
{
return appSysDir;
}

这种方式将两者结合在一起,在Type initializer和单个init中不需要做太多工作。

相关内容

  • 没有找到相关文章

最新更新