Ecco la mia situazione. Ho implementato la risposta .NET 4.0 accettata in questa domanda , che funziona.
Tuttavia, il mio codebase è abbastanza grande e in quanto responsabile di questo codice ho iniziato a ricevere informazioni su questa soluzione. Mi è stato chiesto se non ci sono modi più semplici per realizzare la stessa cosa e se c'è un modo per accorciare l'utilizzo.
In quasi tutti i casi, questa classe viene utilizzata per ottenere o impostare una sola proprietà. Questo favorisce altre soluzioni, dal momento che l'utilizzo finisce così: new UserSessionData().CustomerNumber = 123;
La cosa più vicina che ho è una classe (statica o meno) con membri e metodi statici, come questa:
public static class UserSessionData
{
public static Dictionary<string, string> AsDictionary()
{
return typeof(UserSessionData).GetProperties()
.ToDictionary(p => p.Name, p => p.GetValue(null, null) as string);
}
private static string Get(Expression<Func<string>> e)
{
var me = e.Body as MemberExpression;
return ExternalInterfaceClass.Get(me.Member.Name);
}
private static void Set(Expression<Func<string>> e, string value)
{
var me = e.Body as MemberExpression;
ExternalInterfaceClass.Set(me.Member.Name, value);
}
public static string CustomerNumber {
get { return Get(() => CustomerNumber); }
set { Set(() => CustomerNumber, value); }
}
// ... and hundreds more properties similar to "CustomerNumber"
}
Questa sembra una soluzione abbastanza buona:
- È strongmente tipizzato (cioè posso facilmente refactificare
CustomerNumber
in tutto) - L'utilizzo è ottimo (
UserSessionData.CustomerNumber = 123;
) - Lo standard non è quello brutto - penso sia accettabile
Tuttavia, c'è un problema che non riesco a capire. A volte dobbiamo essere in grado di usarlo un po 'diversamente, A) come tipo di ritorno e B) modificare in blocco la struttura prima di salvare. Per quanto riguarda A, comprendo che una classe statica non può essere utilizzata come tipo di ritorno, tuttavia non so quali sarebbero le mie alternative in questa specifica situazione?
Per quanto riguarda B, immagino di poter ritardare il risparmio effettivo fornendo una sottoclasse dichiarata e richiedendo un salvataggio esplicito, ma l'utilizzo sarebbe peggiorato per il normale caso d'uso (impostazione o ottenimento di una singola proprietà) poiché ogni one-liner dovrebbe essere seguito da una chiamata al metodo di salvataggio.
Ho pensato di creare un'interfaccia per la classe, ma le interfacce non possono definire proprietà statiche. Mi sento un po 'confuso qui, l'aiuto è apprezzato. Fornisci un esempio di codice minimale quando presenti i tuoi pensieri, se possibile - chiarisce molto il punto.