Estoy trabajando en una aplicación y en una de mis clases estáticas, tengo algunas propiedades que serán rutas de archivos de algunos directorios itinerantes.

Existe la posibilidad de que el directorio appdata se haya borrado, por lo que los directorios itinerantes han desaparecido, por lo que obtendré un error:

System.Initialization.TypeException

Ya que los directorios no existen. Tengo métodos en la clase que recrearán el directorio appdata una vez que se descubra que no existen. El único problema es que no sé cómo omitir System.Initialization.TypeException originalmente, luego usar los métodos que escribí para crear los directorios especificados y actualizar las propiedades con los nuevos valores. He estado yendo en círculos y no estoy llegando a ninguna parte. Actualmente, las propiedades se declaran de la siguiente manera:

private static string appRoaming { get; } = $@"{EnvironManager.appData}\App Specific";
private static string sysPattern { get; } = "sys*";
private static string appSysDir { get; } = FileSystem.GetSubdirFromPattern(appRoaming, sysPattern);

Esencialmente, appSysDir no funcionará porque FileSystem.GetSubdirFromPattern no encontrará el directorio appRoaming.

Cualquiera y todas las ideas serán muy apreciadas.

1
Feyam 22 feb. 2020 a las 10:32

2 respuestas

La mejor respuesta

Compruebe la expression- miembros con cuerpo

Ejemplo:

public class Location
{
   private string locationName;

   public Location(string name)
   {
      locationName = name;
   }

   public string Name => locationName;
}

En su caso:

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;
0
Athanasios Kataras 22 feb. 2020 a las 08:17

El método GetAppSysDir() sugerido por @Athanasios Kataras hará el trabajo muy bien, y será llamado en cada invocación get.

Si desea que el appSysDir se inicialice solo una vez, puede llamar al mismo método en la inicialización como

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

Esto funcionará y no conducirá a un TypeException, porque el DirectoryNotFoundException de origen se manejará en el bloque catch.

Personalmente, prefiero no realizar trabajos largos o complejos en la inicialización de tipos. Depende de la situación, lo que es demasiado largo o demasiado complejo.

Puede agregar a la solución get => delegate propuesta por @Athanasios algunos manejos de inicialización como

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

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

De esta forma, combina ambos, sin hacer mucho trabajo dentro del tipo initilializer, y solo init.

0
protix 24 feb. 2020 a las 10:52