Tecniche per abilitare query / calcoli dinamici in fase di runtime

0

Sto lavorando a un progetto C # che fornisce agli utenti un metodo su richiesta per l'importazione di dati da vari formati e quindi esegue azioni simili alla mail-merge per completare un modello. Il processo funziona per i tipi di dati di base. Tuttavia, ho bisogno di aggiungere la possibilità di eseguire calcoli sui dati esistenti (che non sono presenti nell'origine) in modo che i risultati possano essere posizionati sull'output.

Esempio 1 :
Intervallo di date : se sono presenti dati sia nei campi Data di inizio e Data di fine, l'output deve contenere le due date separate da "-". Se ne è presente solo uno, viene emessa solo quella data.

Esempio 2 :
Conditionals - se i dati nel campo X soddisfano i criteri Y, quindi l'output Z.

Esempio 3 :
Formattare il testo prima della conversione in numero e formattare l'output come valuta.
Campo sorgente: "000059975"
Output desiderato: "$ 599.75"
Si noti che la versione di testo del numero era di lunghezza fissa e includeva sia unità di misura intere che parziali (dollari e centesimi in questo caso).

Capisco come eseguire queste azioni nel codice; tuttavia, tutte le configurazioni delle origini dati e dei campi "calcolati" devono essere eseguite in fase di esecuzione tramite stringhe. Tutti i dati, una volta importati, vengono inseriti in un DataTable, quindi qualsiasi soluzione avrà accesso alle funzionalità della stessa in C # 4.

Alcune idee che ho considerato finora:

  • lambda funziona con una regex replace
  • diretta espressioni C #
  • linguaggio di scripting (ad esempio, elaborazione SQL / JavaScript / Python)
  • Una DSL (anche se non ho esperienza con la progettazione / implementazione di tali)

Non ho identificato con successo un modo per implementare una delle possibilità di cui sopra. Si noti inoltre che mentre questa è un'applicazione aziendale interna che sarà in gran parte utilizzata da un piccolo gruppo di personale IT, preferirei mantenere una soluzione che limiti la possibilità di esecuzione di codice arbitrario.

Quali tecniche esistono per rispondere a questa esigenza?

    
posta Gnosian 15.08.2013 - 15:50
fonte

1 risposta

0

Sembra che ci siano alcune soluzioni possibili:

  • Reflection - Reflection.Emmit
  • CodeDOM - System.CodeDom
  • Espressione - System.Linq.Expressions.Expression
  • CSharpCodeProvider - Microsoft.CSharp.CSharpCodeProvider

Modifica
CSharpCodeProvider ha finito per essere la soluzione più semplice. Ho usato la tecnica dettagliata su Trattare C # come linguaggio di scripting e ha funzionato perfettamente.

    
risposta data 16.08.2013 - 16:56
fonte

Leggi altre domande sui tag