Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

Utilizzare gli extension methods anche con .NET 2.0

Il post di ieri di Daniele Mantovani mi ha fatto nascere un dubbio: dal momento che il Common Language Runtime del .NET Framework 3.5 è lo stesso della versione precedente e che gli extension methods sono semplicemente "zucchero sintattico", c'è un modo per utilizzarli anche con i progetti indirizzati a .NET 2.0? La risposta è... sì, è possibile!

Vediamo come fare. Creiamo un progetto .NET 2.0 con Visual Studio 2008 e definiamo la seguente classe:

1 using System; 2 using System.Text; 3 4 namespace ExtensionMethods 5 { 6 public static class Utils 7 { 8 public static byte[] GetBytes(this string str) 9 { 10 return Encoding.Default.GetBytes(str); 11 } 12 } 13 }

Provando a compilare, si ottiene il seguente messaggio di errore:

Cannot define a new extension method because the compiler required type 'System.Runtime.CompilerServices.ExtensionAttribute' cannot be found. Are you missing a reference to System.Core.dll?

Ovviamente, il codice non funziona perché il compilatore non trova l'attributo ExtensionAttribute, contenuto nell'assembly System.Core.dll, che fa parte di .NET 3.5 (Una piccola nota: utilizzare la parola chiave this prima del tipo dell'argomento accettato dal metodo (riga 8) equivale a dire che quel metodo deve essere decorato con l'attributo ExtensionAttribute). Tuttavia, andando ad indagare, si scopre che questo è un attributo "vuoto", ovvero non contiene proprietà sue: in pratica, serve solo al compilatore per fargli capire che stiamo definendo una nuova estensione per il tipo.

A questo punto ci si può chiedere: e se io mi definissi a mano l'attributo mancante? Proviamo. Aggiungiamo un nuovo namespace in fondo alla classe ExtensionMethods, in questo modo:

namespace System.Runtime.CompilerServices { public class ExtensionAttribute : Attribute { } }

In pratica, ci siamo definiti a mano l'attributo ExtensionAttribute. Se tentiamo una nuova compilazione, notiamo che ora fila tutto liscio! Facciamo un'ultima prova per verificare il corretto funzionamento. Spostiamoci in un'altra classe e digitiamo il seguente codice:

string s = "Marco"; Console.WriteLine(s.GetBytes()[0]);

Anche in questo caso, la compilazione avviene correttamente: il metodo GetBytes è stato riconosciuto come extension method per il tipo string.

Print | posted on Sunday, December 9, 2007 11:57 AM | Filed Under [ C# Orcas & .NET 3.5 ]

Feedback

Gravatar

# re: Utilizzare gli extension methods anche con .NET 2.0

Suppongo che intendessi dire che il CLR del framework 3.5 è lo stesso del 2.0, il compilatore è cambiato, se no non riconoscerebbe la nuova sintassi.
Ciao!
12/9/2007 12:25 PM | Lorenzo Barbieri
Gravatar

# re: Utilizzare gli extension methods anche con .NET 2.0

Sì, ho fatto un po' di confusione :-) Grazie per la segnalazione, ho corretto il post!
12/9/2007 1:27 PM | Marco Minerva
Gravatar

# re: Utilizzare gli extension methods anche con .NET 2.0

Esattamente come scritto nel numero di Novembre di MSDN Magazine:

http://msdn.microsoft.com/msdnmag/issues/07/11/BasicInstincts/
12/9/2007 1:57 PM | _
Gravatar

# re: Utilizzare gli extension methods anche con .NET 2.0

Bravo, ottima intuizione.
12/9/2007 2:52 PM | Daniele Mantovani
Gravatar

# re: Utilizzare gli extension methods anche con .NET 2.0

Grazie! Comunque, se non era per te, non mi sarei mai posto il problema, quindi un po' del merito è anche tuo :-)
12/9/2007 3:53 PM | Marco Minerva
Gravatar

# Extension methods in VB .NET 2.0

Extension methods in VB .NET 2.0
3/23/2009 6:42 PM | Around and About .NET World
Gravatar

# Extension methods in VB .NET 2.0

In questigiorni sto lavorando con VB .NET, su un progetto che usa il Framework 2.0 come target, impostazione
3/23/2009 6:43 PM | Around and About .NET World
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET