giovedì 30 settembre 2010

VB.NET: Recuperare i tipi argomenti di un oggetto istanza di un generico

In questo breve post vorrei mostrarvi come capire se un oggetto che avete sotto mano è un generico (o, per dirla meglio, è l’istanza di un generico), recuperare il generico di cui è istanza e i tipi degli argomenti tipo.

Prendiamo, ad esempio la classe:

  1. Tuple(Of String, Int32, Boolean, Double?)

Questa è la definizione concreta di una classe generics, la Tuple(Of T1,T2,T3,T4) di cui gli argomenti tipo sono, rispettivamente: String, Int32, Boolean e Double? .

Letta così sappiamo facilmente capire tutto ciò, ma come facciamo a fare altrettanto all’interno di un nostro software?

Per fare questo ci vengono i aiuto alcuni metodi della classe Type.

In particolare possiamo scrivere:

  1. Dim obj = New Tuple(Of String, Int32, Boolean, Double?)("", 1, True, Nothing)
  2.  
  3. Dim isGeneric = obj.GetType().IsGenericType
  4. Dim genericType = obj.GetType().GetGenericTypeDefinition()
  5. Dim genericArgs = obj.GetType().GetGenericArguments
  6.  
  7. Console.WriteLine(genericType.FullName)
  8. For Each arg In genericArgs
  9.     Console.WriteLine(arg.FullName)
  10. Next

La proprietà IsGenericType ci permette di capire se un tipo è l’istanza di un generics.

Il metodo GetGenericTypeDefinition(), eseguito su un oggetto con IsGenericType = True, restituisce il tipo generico da cui è stato istanziato l’oggetto (nel caso nostro Tuple(Of T1,T2,T3,T4) ). Se il metodo è richiamato su un oggetto che non è istanza di un generico (ad esempio String) otteniamo un’eccezione.

Il metodo GetGenericArguments() ci fornisce un array di Type che identificano il tipo degli argomenti tipo del generico.

Il risultato del precedente codice è:

image

lunedì 27 settembre 2010

Evangelist Microsoft parlano di Windows Phone 7

Parte il Community Tour dedicato a Windows Phone 7, IE9, Windows Azure e Visual Studio

Vi segnalo il seguente post del blog di MASD Italia in cui sono riportate alcune date del prossimo Community Tour:

Parte il Community Tour dedicato a Windows Phone 7, IE9, Windows Azure e Visual Studio

Come potrete vedere qui a Roma è previsto il 12 Novembre 2010. Sarà organizzato da VB Tips &Tricks e DomusDotNet.

L’agenda della tappa romana non è ancora nota ma rimanete connessi con il portale DomusDotNet perchè quanto prima arriverà. Se volete “acquistarci” a scatola chiusa, ecco il link per iscrivervi: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032464064&Culture=it-IT 


VB.NET: Istanziare oggetti generics tramite Reflection

Istanziare oggetti utilizzando la reflection è quanto mai semplice.

Supponiamo di avere una nostra classe Entita:

  1. Public Class Entita
  2.     Public Sub New()
  3.  
  4.     End Sub
  5.  
  6.     Public Sub New(ByVal id As Int32)
  7.         Me.ID = id
  8.     End Sub
  9.  
  10.     Public Property ID As Int32
  11.  
  12. End Class

Normalmente un istanza di classe Entita si ottiene semplicemente:

  1. Dim miaEntita = New Entita()

Se, invece, vogliamo eseguire la stessa operazione utilizzando reflection abbiamo:

  1. ' Recupero il tipo della classe da istanziare
  2. Dim tipoEntita = Type.GetType("Entita")
  3. If tipoEntita IsNot Nothing Then
  4.     ' creo l'entità utilizzando il costruttore di default
  5.     Dim miaEntita = Activator.CreateInstance(tipoEntita)
  6.     ' creo l'entità utilizzando il costruttore che prevede l'id
  7.     Dim miaEntita2 = Activator.CreateInstance(tipoEntita, New Object() {3})
  8. End If

Il nome del tipo da creare utilizzando la Reflection deve essere tale che la classe sia “visibile” dal nostro applicativo.

Quindi se, ad esempio, stiamo istanziando un tipo presente in un assembly esterno dovremmo utilizzare la notazione:

Namespace.Tipo, Assembly

Il risultato del metodo CreateInstance della classe Activator è, però, un Object al cui interno, però, c’è effettivamente un oggetto di classe Entita. Per poter richiamare i metodi dello stesso siamo costretti ad utilizzare il late binding o ancora una volta la Reflection.

In ogni caso il meccanismo è abbastanza semplice. E se, invece, abbiamo un tipo generico come facciamo a dire quali sono i tipi che lo rendono istanziabile?

Facciamo un esempio. Immaginiamo di avere la classe:

  1. Public Class EntitaGenerica(Of TId)
  2.     Public Sub New()
  3.  
  4.     End Sub
  5.  
  6.     Public Sub New(ByVal id As TId)
  7.         Me.ID = id
  8.     End Sub
  9.  
  10.     Public Property ID As TId
  11. End Class

che potrebbe rappresentazare una classe il cui tipo di identificativo può cambiare.

In questo, per eseguire l’equivalente dell’istruzione:

  1. Dim miaEntita = New EntitaGenerica(Of Int32)()

utilizzando la Reflection, non possiamo utilizzare il codice visto in precedenza ma dobbiamo preventivamente recuperare il tipo generico utilizzando il metodo MakeGenericType della classe Type:

  1. Dim tipoEntitaGenerica = GetType(EntitaGenerica(Of ))
  2. Dim tipoId = GetType(Int32)
  3. Dim tipoEntitaIntera = tipoEntitaGenerica.MakeGenericType({tipoId})
  4. Dim entita = Activator.CreateInstance(tipoEntitaIntera)

I passi da eseguire, quindi sono:

  1. Recuperare il tipo del generico da istanziare (nel nostro caso EntitaGenerica(Of ):

    1. Dim tipoEntitaGenerica = GetType(EntitaGenerica(Of ))

  2. Recuperare il tipo o i tipi che saranno gli argomenti del generics (nel nostro caso Int32):

    1. Dim tipoId = GetType(Int32)


  3. Creare il tipo rappresentato dal generico in cui abbiamo definito gli argomenti variabili (nel nostro caso EntitaGenerica(Of Int32):

    1. Dim tipoEntitaIntera = tipoEntitaGenerica.MakeGenericType({tipoId})


  4. Utilizzare la classe Activator su quest’ultimo tipo che è, in definitiva il tipo da noi desiderato:

    1. Dim entita = Activator.CreateInstance(tipoEntitaIntera)

 

Il meccanismo è del tutto analogo per quelle classi generiche che hanno più argomenti. Per esemplificare il discorso supponiamo di voler creare una Tupla con un Int32, una String e un Boolean:

  1. Dim tipoTuplaGenerica = GetType(Tuple(Of ,,))
  2. Dim arrayTipoParametri = {GetType(Int32),
  3.                           GetType(String),
  4.                           GetType(Boolean)}
  5. Dim tipoTuplaReale = tipoTuplaGenerica.MakeGenericType(arrayTipoParametri)
  6.  
  7. Dim tupla = Activator.CreateInstance(tipoTuplaReale,
  8.                                      New Object() {1, "Pippo", True})

In questo esempio i parametri di tipo del generico (la classe Tuple(Of T1,T2,T3)) sono addirittura tre e, non esistendo il costruttore di default, siamo costretti a richiamare il CreateInstance dell’Activator con un array di Object.

venerdì 24 settembre 2010

Evento Windows Phone 7: il backstage!!

Come tutti i grandi eventi, il backstage è quasi più interessante dell’evento stesso.

Ecco qui il filmato del backstage dell’evento di ieri su Windows Phone 7.

 

Technorati Tag: ,,

Code Contracts – Generazione documentazione VB.NET completamente funzionante

La nuova versione dei Code Contracts (1.4.30903.0 rilasciata il 9 Settembre scorso risolve il problema segnalato nel mio precedente post.

La versione precedente (1.4.30707.2) aveva lo spiacevole bug di non essere in grado di copiare correttamente il file xml di documentazione (generato nella cartella obj) all’interno della cartella di bin. Per questo motivo era necessario ricorrere ad uno script di post build per eseguire l’operazione.

La nuova versione risolve il problema e, finalmente, anche gli sviluppatori VB.NET possono avere automaticamente la loro documentazione per i contratti definiti nelle loro classi.

Riferimenti

 

giovedì 23 settembre 2010

Windows Phone 7 & VB.NET

Oggi, durante l’evento dedicato allo sviluppo per Windows Phone 7 e al Marketplace per le applicazioni (a cui sono stato onorato di essere presente), è stato annunciata la disponibilità degli strumenti di sviluppo per Windows Phone dedicati a VB-isti.

I tools sono scaricabili dal link http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a808a69d-6119-47b7-b858-262be5c49915&displaylang=en

Sono in versione CTP, quindi hanno delle limitazioni e, in particolare:

  1. Non possono essere utilizzati per produrre applicazioni da mettere nel marketplace;
  2. Non c’è il supporto per Blend;
  3. Necessitano di una versione professional (almeno) di Visual Studio per poter essere utilizzati (il pacchetto di installazione non installa la express come per i cugini c-sharpisti);
  4. Non esiste la possibilità di sviluppare con XNA ma solo con Silverlight.

Le limitazioni spariranno non appena verrà rilasciata la versione beta. Il fatto, però, che MS abbia rilasciato una CTP così rapidamente smentisce tutti coloro che già avevano ordinato la corona di fiori per VB.NET!!!

Technorati Tag: ,

domenica 19 settembre 2010

IE9 – Pinned Site – Aggiungere un sito al menù Start

Un’altra funzionalità messa a disposiziojne da IE9 è qualle che ci da la possibilità di aggiungere un sito web all’interno del menù Start di Windows 7.

Per fare questo è sufficiente utilizzare l’opzione di menù presente sotto Strumenti->File->Aggiungi al Menù Start:

image

IE9 chiede conferma dell’operazione:

image 
e, in caso, di risposta positiva inserisce il sito tra i programmi del menù start:

image

E’ possibile eseguire questa operazione anche da codice Javascript utilizzando il metodo window.external.msAddSiteMode() 

Ad esempio il seguente codice mette a disposizione un bottone per l’aggiunta del sito al menù start:

  1. <script type="text/javascript">
  2.     function addWebApp() {
  3.         try {
  4.             window.external.msAddSiteMode();
  5.         }
  6.         catch (ex) {
  7.             // Site Mode not supported.
  8.         }
  9.     }
  10. </script>
  11.  
  12. <button onclick="addWebApp()" title="Click to add this webpage to your Windows Start menu.">
  13.     Launch in Site Mode</button>

E’ possibile anche gestire l’evento di avvenuto salvataggio del sito all’interno del menù start. L’evento in questione è mssitemodeinstalled. Un esempio è il seguente:

  1. <script type="text/javascript">
  2.     window.onload = function () {
  3.         document.addEventListener('mssitemodeinstalled', function () {
  4.             alert("Site Mode shortcut installed sucessfully.");
  5.         }, false);
  6.     }
  7. </script>

Ovviamente il codice funziona solamente se ci troviamo su IE9.

E’ possibile customizzare alcune proprietà del sito “pinned” utilizzando i tag meta. I valori possibili sono riportati nel seguente link.

Ad esempio, la seguente è una home page con le funzioni di aggiunta al menù Start:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <title></title>
  5.     <meta name="application-name" content="Mia Home Page" />
  6.     <meta name="msapplication-tooltip" content="Visita la Home Page del mio sito" />
  7.     <meta name="msapplication-starturl" content="http://localhost:20000/home.htm" />
  8.     <meta name="msapplication-window" content="width=800;height=600" />
  9.     <meta name="msapplication-navbutton-color" content="yellow" />
  10. </head>
  11. <body>
  12.     <script type="text/javascript">
  13.         function addWebApp() {
  14.             try {
  15.                 window.external.msAddSiteMode();
  16.             }
  17.             catch (ex) {
  18.             }
  19.         }
  20.         window.onload = function () {
  21.             try {
  22.                 document.addEventListener('mssitemodeinstalled', function () {
  23.                     alert("Sito installato correttamente nel menùStart.");
  24.                 }, false);
  25.             } catch (e) {
  26.             }
  27.         }
  28.     </script>
  29.     <button onclick="addWebApp()" title="Clicca per inserire il mio sito tra i programmi del menù start.">
  30.         Salva il sito nel menù Start</button>
  31. </body>
  32. </html>

Quando salviamo il sito all’interno del menù Start otteniamo che questo verrà aperto con  favicon.ico come icona di riferimento, con la finestra 800x600 e con i pulsanti di back e forward gialli:

image

sabato 18 settembre 2010

ALM Reloaded: il giorno dopo!!

Eccomi qui a tirare le somme del primo evento DomusDotNet: ALM Reloaded.

A mio modo di vedere un evento riuscito e la conferma mi è arrivata quando tanti dei presenti si sono complimentati prima di lasciare la sede Microsoft di Roma.

Qualcuno obbietterà che è facile fare risultato quando si schiera una squadra con tre pezzi da novanta come Lorenzo, Gian Maria e Matteo, e, io non solo rispondo che mi piace vincere facile, ma che una squadra forte va pure assemblata e messa in campo, quindi anche se gli speaker sono di assoluto livello l’idea di metterli assieme è stata decisamente buona.

Dopo dieci anni di tentativi e un paio di community tragicamente naufragate, finalmente un evento (non ufficiale Microsoft) con un drop rate “normale”: 55 iscritti e 45 presenti rappresenta, a mio avviso, un risultato inaspettato!!

Un grazie va , quindi, a chi è venuto all’evento, a Lorenzo che, nonostante fosse reduce da due lab su Windows Phone 7, non è voluto mancare (e ha tirato fuori dal cilindro una keynote delle sue che da sola valeva il prezzo del biglietto), a Gian Maria e Matteo (ottime sessioni) e ai ragazzi della community che, nonostante impegni personali e lavorativi, si sono sobbarcati l’onere dell’organizzazione.

Il problema, però, viene adesso, perchè dovremo dimostrare che il buon risultato di ieri non è un caso e dovremo cominciare ad organizzare altri eventi anche tenendo conto dei feedback ricevuti in quello di ieri.

venerdì 17 settembre 2010

IE9 – Pinned Site

Una funzionalità sfiziosa (forse inutile ma sfiziosa) presente su IE9 è la possibilità di “pinnare” i nostri siti preferiti all’interno della Application Bar di Windows 7.

Per fare questo è sufficiente draggare la scheda di IE9 in cui c’è il sito da pinnare al di sopra dell’application bar (tra le applicazioni “standard”):

image

A questo punto il sito è raggiungibile direttamente cliccando sull’icona presente nell’application bar.

La finestra di IE9 di un sito pinnato mostra la favicon dello stesso in alto a sinistra.

image che ci permette, in qualunque momento, di ritornare alla pagina “pinnata”.

 

Technorati Tag: ,

giovedì 9 settembre 2010

Laboratorio su Windows Phone 7 a Roma

Il giorno 16 Settembre ci sarà un laboratorio per lo sviluppo di applicazioni su Windows Phone 7 nella sede romana della Microsoft in Via Avignone 10 (zona EUR).

L’agenda della giornata sarà:

  • 10.30 – 12.30 sessioni e discussioni tecniche su gestione delle applicazioni, tombstoning, uso dei launcher e dei chooser, sensori, etc...
  • 13.30 – 18.00 laboratori con a disposizione i prototipi di Windows Phone 7 e PC opportunamente configurati (Zune, Visual Studio, etc...) da usare per le prove

    Per maggiori info o per partecipare andate qui.

    A seguire ci sarà una cena tra amici per parlare del più e del meno e di Windows Phone 7!!!

    Technorati Tag: ,

  • mercoledì 8 settembre 2010

    Pubblicata la seconda puntata di “Introduzione ai Code Contracts”

    E’ stata pubblicata oggi la seconda di cinque puntate di uno speciale sui Code Contracts.

    specialecodecontracts

    In questa puntata cominciamo a vedere come implementare i contracct grazie alla classe Contracts e come gestirli all’interno di interfacce e classi astratte.

     

    giovedì 2 settembre 2010

    Windows Phone 7 – Released To Manufacturing

    Windows Phone 7 è in RTM (Released To Manufactoring).

    Ad annunciarlo un post sul blog di Windows Phnoe:

    Windows Phone 7 – Released To Manufacturing

    Un altro passo verso l’arrivo presto sul mercato!!

    Technorati Tag:

    JetBrains rilascia la versione 5.1.1 di ReSharper e le RC di dotTrace e dotCover

    JetBrains ha annunciato il rilascio della versione 5.1.1 di ReSharper e le Release Candidate dei tools dotCover e dotTrace.

    Maggiori info al seguente indirizzo:

    JetBrains .NET Tools Blog

     

    mercoledì 1 settembre 2010

    Introduzione ai Code Contracts (parte 1) su DomusDotNet

    E’ stata pubblicata oggi la prima di cinque puntate di uno speciale sui Code Contracts.

    specialecodecontracts

    La prima puntata propone una breve introduzione al design by contract e ai tools disponibili per il mondo .NET.

     

    ALMReloaded: finalmente agenda ed iscrizioni

    Concluso il sondaggio per decidere le sessioni dell’evento, ecco che viene pubblicata l’agenda :

    14:30 - 15:00
    Registrazione

    15:00 - 15:15
    Keynote introduttiva: Lorenzo Barbieri (MSFT)

    15:15 - 16:00
    A lap around Development Methodologies: Scrum, SDL, MSF.
    Panoramica introduttiva sulle metodologie di sviluppo, e sui Process Template Microsoft attualmente rilasciati per Team Foundation Server.

    16:00 - 16:45
    Deep dive on Source Code Management. Branching Strategy questa sconosciuta.
    In questa sessione vedremo come gestire il codice sorgente con Team Foundation Server mediante diversi approcci di Source Code, Configuration e Release Management.

    16:45 - 17:00
    Pausa

    17:00 - 17:45
    Procedure di testing nell'ALM.
    Cosa è veramente il test e soprattuto, quale metodologie di test vanno adottate in relazione al processo scelto? Lo scopo di questa sessione è andare oltre il concetto di Unit Test e soprattutto comprendere quali metodologie di test adottare nelle varie fasi della realizzazione.

    17:45 - 18:30
    Integrazione continua.
    Una delle pratiche più interessanti ed utili da introdurre nel proprio processo è l'integrazione continua, che permette di avere un monitoraggio costante dello stato di salute del processo. In questa sessione verranno esposti I concetti base di Integrazione continua e declinati in concreto sull'infrastruttura di Team Foundation Server.

    18:30
    Chiusura lavori

    Il link per la registrazione e le info logistiche sono sulla pagina dell’evento nel portale di DomusDotNet:

    http://www.domusdotnet.org/eventi/alm-reloaded.aspx

    A questo punto tocca solo a voi: iscrivetevi e non ve ne pentirete!!!

     

    Applicazioni Windows Phone 7 e novità del Marketplace

    Vi segnalo l’evento virtuale sullo sviluppo per Windows Phone 7 che si terrà il giorno 23 settembre dalle 14:30 alle 18:00.

    Applicazioni Windows Phone 7 e novità del Marketplace

    A parte l’indubbio interesse per questo nuova piattaforma, seguendo l’evento c’è la possibilità di vincere 4 Windows Phone 7!!!

    Io no me lo perderei.