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.
2 respuestas
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;
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.
Nuevas preguntas
c#
C # (pronunciado "see sharp") es un lenguaje de programación multi-paradigma de alto nivel, estáticamente tipado desarrollado por Microsoft. El código C # generalmente se dirige a la familia de herramientas y tiempos de ejecución .NET de Microsoft, que incluyen .NET Framework, .NET Core y Xamarin, entre otros. Use esta etiqueta para preguntas sobre el código escrito en las especificaciones formales de C # o C #.