2010-06-04 11 views
1

J'ai une classe de génériques, qui utilise TBase comme paramètre de type. En utilisant MEF, je voulais une liste de type générique qu'il devrait importer. J'ai essayé d'utiliser ceci:Classe générique MEF avec constructeur comme contrat de type

1) 

[ImportMany(typeof(TBase))] 
public List<TBase> ObjectList { get; set; } 

2) 
Type IValueType = typeof(TBase) 

[ImportMany(IValueType)] 
public List<TBase> ObjectList{ get; set; } 

3) 
[ImportMany(TBase)] 
public List<TBase> ObjectList{ get; set; } 

Les premiers spectacles
{'TBase': an attribute argument cannot use type parameters}

Le second montre
{An object reference is required for the non-static field, method, or property}

la troisième montre
{'TBase' is a 'type parameter' but is used like a 'variable' }

Qu'est-ce que je fais mal ici? Comment puis-je le réparer?

Répondre

2

Essayez le following syntax:

[ImportMany] 
public IEnumerable<TBase> ObjectList{ get; set; } 

EDIT La première syntaxe devrait fonctionner comme [ImportMany(typeof(TBase))] est une déclaration juridique et ImportMany prend un type dans ses constructeurs/

+0

Oui, si TBase est un argument générique, il n'est pas connu au moment de la compilation et je ne crois pas qu'il vous permettra d'incorporer cette information dans un attribut. Cependant, comme le fait remarquer Igor, vous pouvez simplement laisser la valeur hors de l'attribut ImportMany qui amènera MEF à regarder le type de la propriété pour obtenir le type de contrat, dans ce cas quel que soit le type de TBase pour les instances d'objet. Gardez cependant à l'esprit que le MEF ne prend pas en charge les génériques ouverts pour l'instant, afin que cela apparaisse dans le catalogue, il devra être sur un type générique fermé. –

0

MEF requiert des arguments qui peuvent être converti en chaînes constantes au moment de la compilation. Puisque vous utilisez TBase qui est générique et qui ne peut être réalisé qu'au moment de l'exécution, les métadonnées MEF ne peuvent pas être produites. Essayez d'utiliser une interface non générique au lieu du type générique TBASE.