2010-02-24 8 views
0

J'ai une classe de collection générique d'objet métier qui contient des objets métier:Comment accéder et utiliser les paramètres de type générique en tant que type normal en C#?

public abstract class BusinessObjectCollection<T> : ICollection<T> 
    where T : BusinessObject 

Je veux écrire une méthode sur ma classe de collection qui renvoie le T et une méthode type qui retourne un objet nouvellement instancié de type

En C++, ce serait là que vous déclareriez simplement un typedef value_type T; et que vous utiliseriez BusinessObjectCollection :: value_type mais je ne trouverais pas d'équivalent en C#.

Des suggestions?

EDIT: Un proche parallèle à la typedef je pense est la méthode:

Type GetGenericParameter() { 
    return typeof(T); 
} 

Répondre

10

Essayez quelque chose comme ceci:

public abstract class BusinessObjectCollection<T> : ICollection<T> 
    where T : BusinessObject, new() 
{ 
    // Here is a method that returns an instance 
    // of type "T" 
    public T GetT() 
    { 
     // And as long as you have the "new()" constraint above 
     // the compiler will allow you to create instances of 
     // "T" like this 
     return new T(); 
    } 
} 

En C#, vous pouvez utiliser le paramètre de type (c.-à-T) comme vous le feriez pour tout autre type dans votre code - il n'y a rien de plus à faire. Pour pouvoir créer des instances de T (sans utiliser de réflexion), vous devez contraindre le paramètre type avec new() qui garantira que tous les arguments de type contiennent un constructeur sans paramètre.

+0

En fait, cela utilise aussi la réflexion. C# émet un appel à Activator.CreateInstance. – Josh

+0

Cela est très vrai que le * compilateur * émet des appels à 'Activator.CreateInstance'. Je disais simplement que le PO n'aurait pas besoin d'utiliser l'API de réflexion directement, pas que la réflexion n'était pas du tout utilisée sous les couvertures. –

Questions connexes