Clonare i dati in una classe che eredita da Models Entities

Usando modelli quali collegamento dati ad un MSSQL db, capita di implementare delle classi che, ereditando dagli stessi modelli, posseggano la stessa struttura base ed in più aggiungano delle estensioni per migliorare/ottimizzare l’interfaccia passando attraverso MVC.

Come applicazione pratica, si supponga di trovarsi nella necessità di avere, nella classe figlia, tutti i dati della classe madre con, in aggiunta, una o più proprietà che raccoglie/ono i dati di una o più colonne per visualizzarli all’interno di una combobox.

A titolo di esempio si riporta una sezione di codice che illustra come trasportare i dati dalla classe base alla classe figlia senza dover ricorrere alla formula di assegnazione dei valori colonna per colonna (classefiglia.proprietà.valore = classemadre.proprietà.valore).

 

public class ClsClienti : TabClienti
   {
       dbEntities db;
	private string datiCliente; //Proprietà non ereditata ma necessaria all'utilizzatore
        public string DatiCliente
        {
            get { return datiCliente; }
            set { datiCliente = value; }
        }
//...

public ClsClienti GetClienteByID(Int32 IDCliente)
      {
          db = new GeStAvEntities(); ClsClienti result = new ClsClienti(); //conterrà i dati finali da recuperare...
          TabClienti cliente = (from c in db.TabClienti
                                 where c.IDCliente == IDCliente
                                 orderby c.Cognome, c.Nome
                                 select c).FirstOrDefault();
          if (cliente != null)
          { //...
             Type t = typeof(ClsClienti);
              PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
              Int32 nrCol = propInfos.Length;
              foreach(PropertyInfo prop in propInfos)
                  {
                      var sp = cliente.GetType().GetProperty(prop.Name);
                      if (sp != null)
                      {
                          //Se entro qui significa che la classe base ha la stessa proprietà della classe derivata
                          //se non entro significa che sto prendendo in considerazione una proprietà della classe
		          //derivata non esistente nella classe base
			  var value1 = sp.GetValue(cliente, null);

			  //Assegno il valore alla corrispondente variabile nella classe figlia
                          result.GetType().GetProperty(prop.Name).SetValue(result, value1, null);

                       }
                  }
		 //qui popolo la variabile datiCliente che non appartiene alla classe madre.
              result.datiCliente = cliente.Mnemo + " | " + cliente.RagSoc + ", " + cliente.Cognome + " " + cliente.Nome;
              return result;
          }
          else
              return null;
      }
}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Non sono una macchina... *