2010-03-15 4 views

Répondre

21

Vous pouvez ajouter la contrainte : new():

void Foo<T>() where T : class, new() { 
    T newT = new T(); 
    // do something shiny with newT 
} 

Si vous ne disposez pas de la contrainte, alors Activator.CreateInstance<T> peut aider (moins la compilation de vérification):

void Foo<T>() { 
    T newT = Activator.CreateInstance<T>(); 
    // do something shiny with newT 
} 

Si vous voulez dire vous le type lui-même, alors probablement quelque chose comme:

Type itemType = typeof(int); 
IList list = (IList)Activator.CreateInstance(
     typeof(List<>).MakeGenericType(itemType)); 
+1

+1 Il peut être intéressant de souligner que les deux exemples de code font la même chose à l'exécution (c'est-à-dire utilisent la classe 'Activator'). Vous appelez la vérification à la compilation, mais vous pouvez vouloir en savoir un peu plus sur ce que vous voulez dire. –

+0

@Andrew Hare: Point intéressant! J'aurais supposé T newT = new T() serait fait lorsque le code Foo spécifique au type est généré. – Jimmy

+2

Pour faire suite au point d'Andrew; la contrainte ': new()' permet de vérifier le code d'appel lorsque vous cliquez sur "build", mais en réalité cela se résume à la même IL (pour des détails d'implémentation différents). Cela fonctionnera bien sans cela, mais si vous appelez 'Foo ', alors attendez-vous à la douleur. –

Questions connexes