13 messaggi dal 18 novembre 2004
Ciao a tutti,
sto scrivendo una funzione generica per popolare le mie collezioni del Data Layer da un SqlDataReader.
La funzione ha lo scopo di sostituire le tantissime righe di codice molto simili che si scrivono per ciclare il datareader e popolare le property dell'istanza entità a cui fa riferimento la collection.
Il problema è che anche utilizzando System.Reflection non riesco ad ottenere il risultato che voglio.
Passo alla funzione la collection come object generico (dal momento in cui non posso fare il cast specifico...altrimenti non sarebbe una funzione generica  ). Ho provato anche a passare la stringa con il nome della classe per poi utilizzarla nel metodo CreateInstance della classe Assembly.
Diciamo che questa parte funziona correttamente.
Il problema arriva quando provo ad invocare il metodo ADD della collection per aggiungere una nuova istanza della classe entità, in questo modo:

object[] _obj = new object[1];
_obj[0] = _MiaClasseEntita;
_method.Invoke(_MiaClasseCollection, _obj);

Il messaggio di errore che restituisce sulla riga dell'invoke è:
"Un oggetto di tipo 'DL.ENTITA.CONTRATTO' non può essere convertito nel tipo 'DL.ENTITA.CONTRATTO')"

Preciso che DL.ENTITA è il namespaces dove ho le classi entità utilizzate nelle collection... nell'esempio che sto facendo tento di caricare nella collection CONTRATTI istanze della classe CONTRATTO.

Aiutatemi PLEASE!!!!!
13 messaggi dal 18 novembre 2004
Aggiungo il codice della funzione

public void Caricamento(ref object MyCollection, SqlDataReader _dr)
{
try
{
//PUNTO ALL'ASSEMBLY DEL DATA LAYER
Assembly asm = Assembly.LoadFile("C:\\Progetti\\XXX\\XXX\\Web\\Bin\\dl.dll");

//CREO UN'ISTANZA DELLA CLASSE ENTITA' (LA PARTE STRINGA SARA' UN'ULTERIORIORE ARGOMENTO INPUT DELLA FUNZIONE
object __entita = asm.CreateInstance("DL.Entita.Contratto");

Type typeCollection = MyCollection.GetType();
Type typeEntity = __entita.GetType();

Convert.ChangeType(__entita, typeEntity);

MethodInfo _method = typeCollection.GetMethod("Add");
MethodInfo _methodEntity = typeEntity.GetMethod("Contratto");

while (_dr.Read())
{
//MyEntity = GeneralFunction.SetFields(__entita, _dr);

object[] _obj = new object[1];
_obj[0] = __entita;

//!!!!!!!! IN QUESTO PUNTO GENERA ECCEZIONE: UN OGGETTO DI TIPO "DL.ENTITA.CONTRATTO" NON PUO' ESSERE CONVERTITO NEL TIPO "DL.ENTITA.CONTRATTO"
_method.Invoke(MyCollection, _obj);
}
}
catch (Exception ex)
{
//Response.Write(ex.ToString());
}
molto meglo utilizzare i generics, visto che a questo servono.

trovi diversi esempi in giro, a questo articolo per esempio non manca quasi niente http://www.codeproject.com/csharp/GenCSharp.asp

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.