@Termit e @Burnzy formulate buone soluzioni che coinvolgono factory methods.
Il problema è che si sta caricando la routine di analisi con un po 'di logica in più (più test, più errori) per rendimenti dubbi.
Un altro modo per farlo sarebbe utilizzare un DataField basato su stringhe semplificato con metodi di lettura tipizzati - la risposta migliore per la domanda this.
Un'implementazione di un metodo del valore tipizzato che sarebbe bello, ma funziona solo per i tipi di valore (che non include le stringhe, ma include DateTimes):
public T? TypedValue<T>()
where T : struct
{
try { return (T?) Convert.ChangeType(this.Value, typeof(T)); }
catch { return null; }
}
che sto supponendo che si' re vuole usare le informazioni sul tipo per fare cose come assegnare dinamicamente controlli utente al campo, regole di validazione, tipi SQL corretti per persistenza, ecc.
Ho fatto un sacco di questo genere di cose con approcci che sembrano un un po 'come il tuo
Alla fine della giornata dovresti separare i tuoi metadati dal codice - @ La risposta di Burnzy sceglie il codice basato sui metadati (un attributo "tipo" dell'elemento DataField) ed è un esempio molto semplice di questo.
Se si ha a che fare con XML, gli XSD sono una forma di metadati molto utile ed estensibile.
Per quanto riguarda ciò che si memorizzano i dati di ogni campo - uso stringhe perché:
- sono annullabili
- possono memorizzare i valori parziali
- in grado di memorizzare i valori non validi (fa dicendo che l'utente Ordina il loro atto più trasparente)
- possono memorizzare liste
- casi speciali non invaderà il codice estraneo, perché non ce ne sono
- imparare le espressioni regolari, convalidare, essere felice
- è possibile convertirli in tipi più forti molto facilmente
ho trovato molto gratificante per sviluppare piccoli quadri come questo - si tratta di un'esperienza di apprendimento e si verrà fuori capire molto di più su UX e la realtà della modellazione da esso.
ci sono quattro gruppi di casi di test che vi consiglio di affrontare per primo:
- date, orari, timestamp (quello che io chiamo DateTime), periodi (periodo)
- in particolare, assicurati di testare una località server diversa da quella del cliente.
- liste - selezione multipla chiavi esterne ecc
- valori nulli
- valido di ingresso - si tratta in generale mantenendo il valore originale
Utilizzando stringhe semplifica tutto questo molto, perché ti permette di chiarezza delimitare le responsabilità all'interno del tuo quadro. Pensa di creare campi contenenti elenchi nel tuo modello generico: diventa piuttosto peloso piuttosto rapidamente ed è facile finire con un caso speciale per gli elenchi in quasi tutti i metodi. Con gli archi, il dollaro si ferma lì.
Infine, se si desidera una solida implementazione di questo tipo di cose senza dover fare molto, si consideri lo DataSets - vecchia scuola che conosco - fanno ogni sorta di cose meravigliose che non ti aspetteresti ma devi RTFM .
Lo svantaggio principale di questa idea sarebbe che non è compatibile con l'associazione dei dati WPF, anche se la mia esperienza è stata che la realtà non è compatibile con l'associazione dei dati WPF.
spero ho interpretato le vostre intenzioni in modo corretto - buona fortuna in entrambi i casi :)
Mi sento come se non sapessi mai quale sottoclasse di DataField hai comunque, quindi perché non usare solo la classe dataField {nome stringa; valore dell'oggetto;} '? –
Non voglio veramente fare riferimento a tutti i valori come oggetto. Se dovessi adottare un approccio simile, sembrerebbe più semplice usare solo la classe DataField {nome stringa; tipo di stringa; valore stringa}. –
Certo, ma poi dovrai analizzare i tuoi dati ogni volta prima di usarlo. Se si pre-analizzano i dati negli oggetti e quindi li si memorizzano nel campo dati, è possibile riprodurli solo quando si è pronti per utilizzarli. Questo è ciò che ADO.NET fa con DataReader (sebbene DataReader ritardi l'esecuzione dell'analisi fino a quando non sono necessari i valori della colonna). Ad esempio, 'if (myField.Value è DateTime {/ * fai quella data * /}' o 'if (myField.Name ==" importantDateThing ") {var date = (DateTime) myField.Value;/* fai importanty data thing * /} ' –