Immaginate la seguente classe:generare dinamicamente proprietà getter/setter attraverso la riflessione o simili
public class Settings
{
[FileBackedProperty("foo.txt")]
public string Foo { get; set; }
}
Mi piacerebbe essere in grado di scrivere qualcosa di simile al precedente e hanno settings.Foo
leggere dal file "foo.txt" e settings.Foo = "bar"
scrivere su "foo.txt".
Ovviamente questo è un esempio semplificato e non farei quanto sopra in un'applicazione di produzione, ma ci sono altri esempi, come se volessi che Foo venisse memorizzato nello stato di ASP.net Session "foo" ma mi stanco di scrivere il seguente codice più e più volte:
public int Foo
{
get
{
if (Session["foo"] != null)
return Convert.ToInt32(Session["foo"]);
else
// Throw an exception or return a default value
}
set
{
Session["foo"] = value;
}
}
(ancora una volta questo esempio è semplificato e non vorrei scrivere il codice di cui sopra, in realtà sto mentendo, ho il codice di cui sopra e sto lavorando al refactoring , quindi questa domanda)
L'esempio precedente va bene a meno che non si abbiano 50 valori di sessione diversi che hanno tutti una logica simile. Quindi è in qualche modo possibile convertire la seconda proprietà in qualcosa di simile alla prima? (? Utilizzando gli attributi e la riflessione, o forse qualche altro metodo)
Se si utilizza Visual Studio, è necessario dare un'occhiata a [frammenti di codice] (http://msdn.microsoft.com/en-us/library/ms165392%28v=vs.90%29.aspx). Ti consentono di digitare qualcosa di breve, di espandere il codice desiderato e quindi di compilare le aree specificate. Simile al propg esistente, ecc. –
@JoshuaDrake Questo sembra tanto male quanto copiare/incollare. Cosa succede se voglio cambiare l'implementazione? Devo ancora tornare indietro e modificare ogni proprietà individualmente. – thelsdj
Quindi si desidera aggiungere dinamicamente le proprietà in fase di runtime? Avete tutte le macchine server o basse aspettative di prestazioni? Non che tu non possa farlo, ma vorrei caldamente metterlo in guardia. Se non intendevi a runtime, dovresti comunque rigenerare qualsiasi output di codice. –