posts - 315, comments - 268, trackbacks - 15

My Links

News

View Pietro Libro's profile on LinkedIn

DomusDotNet
   DomusDotNet

Pietro Libro

Tag Cloud

Article Categories

Archives

Post Categories

Blogs amici

Links

ConvertAll<>

Supponiamo di avere una situazione schematizzata dal seguente Class Diagram:

image

Supponiamo di avere un unico metodo Add che aggiunge oggetti di tipo Person ad una lista tipizzata denominata People, come nel caso seguente:

1 2 List<Person> _people = new List<Person>(); 3 4 private void Add(Person p) 5 { 6 _people.Add(p); 7 }

Utilizziamo il seguente codice per popolare la collezione People :

1 Employee e = null; 2 e = new Employee(); 3 e.Age = 21; 4 e.Name = "Peter"; 5 e.Surname = "Book"; 6 e.Office = "Piazzale Kennedy 21"; 7 8 Add(e); 9 10 e = new Employee(); 11 e.Age = 23; 12 e.Name = "Anna"; 13 e.Surname = "Rossi"; 14 e.Office = "Via Ammiraglio Cagni 36"; 15 16 Add(e); 17 18 e = new Employee(); 19 e.Age = 35; 20 e.Name = "Mario"; 21 e.Surname = "Rossi"; 22 e.Office = "Via Duca degli Abruzzi"; 23 24 Add(e);

Se volessimo convertire la nostra lista tipizzata di oggetti Person in una lista tipizzata di oggetti Employee:

1 List<Employee> employees = new List<Employee>();

possiamo seguire due strade, la prima è utilizzare un ciclo foreach:

1 foreach (Person p in _people) 2 employees.Add((Employee)p);

La seconda  è quella di utilizzare il metodo generico ConvertAll<> che esegue la conversione di un Array di un tipo, Person in questo caso, in un Array di un'altro tipo,Employee, utilizzando un Converter, ovvero un metodo che esegue la conversione di un tipo in un altro. In soldoni (righe di codice :-) ):

Il Converter

1 private Employee PersonEmployeeeConverter(Person p) 2 { 3 if (p.GetType() == typeof(Employee)) 4 return (Employee)p; 5 else 6 return null; 7 }

Il codice di conversione:

1 employees = _people.ConvertAll<Employee>(new Converter<Person, Employee>(PersonEmployeeeConverter));

Osservazioni: ConvertAll<> e il concetto di Converter sono stati introdotti con il .Net Framework 2.0

Technorati Tag:

Print | posted on domenica 24 agosto 2008 16:32 | Filed Under [ C# ]

Feedback

Gravatar

# re: ConvertAll<>

Ciao, incuriosito dalla tua domanda, ho fatto qualche piccolo test con NHibernate. Premetto che non sono un grande esperto di questa tecnlogia, ma per effettuare le prove ho dovuto un pò cambiare lo scenario iniziale delle classi, e adattare il "Converter". Se provo a modificare un valore di un oggetto Employee durante la stessa sessione e provo a salvare,se l'attributo class dell'elemento generator è impostato su native, viene sollevata la seguente eccezione: "a different object with the same identifier value was already associated with the session". In una nuova Session, viene aggiunto un nuovo Employee e non modificato il precedente. Stesso risultato provando a cambiare il valore dell'attributo class di generator.
25/08/2008 14:44 | Pietro Libro
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET