Dynamic build of generics types at runtime

How to create dynamically a type in .Net when it’s only known a string representation of that type, I think it’s an operation known to almost all .Net programmers, but what happened with types with type parameters (or generics) ?

In .Net is possible to create dynamically both generics with a known type, i.e. List<>, and generics with type in turn dynamically built.

Here’s an example:

a) Dynamic generated both type parameter and type

Type collectionType = Type.GetType("System.Collections.Generic.List`1, mscorlib");
if (collectionType == "null")
    throw new InvalidOperationException("Invalid type");
Type genericType = Type.GetType("MyNamespace.MyType, MyAssembly");
Type listWithGeneric = collectionType.MakeGenericType(genericType);
var myList = Activator.CreateInstance(listWithGeneric) as IList;

b) Dynamic generated type parameter with a known type (System.Collection.Generic.List in this case):

Type genericType = Type.GetType("MyNamespace.MyType, MyAssembly");
Type listWithGeneric = typeof(List<>).MakeGenericType(genericType);
var myList = Activator.CreateInstance(listWithGeneric) as IList;
Technorati Tags: ,,

C# 4.0 – Parametri opzionali

Leggo che tra le nuove feature di C# 4.0 c’è la possibilità di indicare come opzionali i parametri di un metodo o di un costruttore, in tal caso il parametro viene inizializzato con un valore di default fornito dal programmatore.

Una cosa di questo tipo:

public Person(string firstName, string lastName, string city = "")
{    
        //
}

che può essere istanziata in entrambi le modalità:

Person p = new Person("Maurizio", "Tammacco");
Person p1 = new Person("Maurizio", "Tammacco", "Bari");

Nel primo esempio, poichè il parametro “City” è opzionale, viene automaticamente assegnato il valore di default, ovvero stringa vuota in questo caso.

Sinceramente questa nuova funzionalità non mi entusiasma per niente, anzi la ritengo quasi inutile visto che comunque una funzionalità analoga è possibile ottenerla con le “Automatic properties”, ovvero proprietà pubbliche inizializzabili nella stessa istruzione che crea l’istanza di un oggetto, anche se questa funzionalità riguarda comunque un membro definito come proprietà.

I parametri opzionali sono da sempre presenti in Visual Basic, sin dalla versione 6 e poi anche nelle varie versioni .NET. Questo comportava che, in caso di interoperabilità tra i due linguaggi, il codice C# che richiamava un metodo scritto in VB .NET con parametri opzionali era costretto a passargli comunque tutti i parametri, opzionali e non;  la stessa cosa accadeva nell’utilizzo della COM Interop da C#. Adesso non sarà più necessario passare i parametri opzionali, ma, ripeto, a mio avviso l’utilità di questa funzionalità è discutibile, e riguarda unicamente una più stretta compatibilità tra i due linguaggi più usati nel mondo .NET.