处理直到稍后可能不存在的属性的最佳方法
Best way to handle properties that may not exist until later point
我正在开发一个应用程序,在我的一个静态 classes 中,我有一些属性将成为一些漫游目录的文件路径。
有可能appdata目录被清空,导致漫游目录没有了,所以会报错:
System.Initialization.TypeException
因为目录不存在。我在 class 中有方法,一旦发现它们不存在,就会重新创建 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;
}
这种方式结合了两者,在类型初始化器中没有做太多工作,并且单独初始化。
我正在开发一个应用程序,在我的一个静态 classes 中,我有一些属性将成为一些漫游目录的文件路径。
有可能appdata目录被清空,导致漫游目录没有了,所以会报错:
System.Initialization.TypeException
因为目录不存在。我在 class 中有方法,一旦发现它们不存在,就会重新创建 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;
}
这种方式结合了两者,在类型初始化器中没有做太多工作,并且单独初始化。