Лучший способ обработать свойства, которые могут не существовать до более поздней точки - PullRequest
1 голос
/ 22 февраля 2020

Я работаю над приложением, и в одном из моих классов stati 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.

Любая и всякая проницательность будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Метод GetAppSysDir(), предложенный @ Athanas ios Kataras прекрасно выполнит свою работу и будет вызываться при каждом get вызове.

Если вы хотите, чтобы appSysDir инициализировался только один раз, вы может вызвать тот же метод при инициализации, как

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

Это будет работать и не приведет к TypeException, потому что исходный DirectoryNotFoundException будет обрабатываться в блоке catch.

Лично я предпочитаю не выполнять длительную или сложную работу, выполняемую при инициализации типа. Это зависит от ситуации, что является слишком длинным или слишком сложным.

Вы можете добавить к решению get => delegate, предложенному @ Athanas ios, некоторую обработку инициализации, например

if (!isAppSysDirInitialized) 
{
   // Do appSysDir initialization here.

   // After initialization:
   isAppSysDirInitialized = true;
} 
else
{
   return appSysDir;
}

Таким образом, комбинируя оба, не делая много работы внутри инициализатора типа, и одиночная инициация.

0 голосов
/ 22 февраля 2020

Отметьте выражение-члены-члены

Пример:

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;
...