2010-11-28 20 views
2

Ce que je suis en train de faire est pour que cela fonctionne:Comment appelez-vous un délégué exporté via MEF avec liaison tardive?

GetMethod(Key key)(...some arguments...) 

Les « ... quelques arguments ... » varie entre chaque appel de GetMethod, y compris en nombre de paramètres, donc il n'y a pas action spécifique < ...> que je peux utiliser.

Maintenant le GetMethod parcourt la liste des arguments pour trouver une correspondance dans une liste de Tuple et retourne le deuxième argument du Tuple, qui est la dynamique. Cette liste a été créée en utilisant par MEF

<some CompositionContainer>.GetExports(new ImportDefinition(a => true, "...", ImportCardinality.ZeroOrMore, true, false)) 
      .Select(e => (Tuple<Key, dynamic>)Tuple.Create((Key)e.Metadata["Key"], e.Value)) 
      .ToList(); 

Maintenant, il semble que le deuxième élément de la typle n'est pas réellement une action du type approprié, mais plutôt un ExportedDelegate. Y a-t-il un moyen de faire en sorte que le deuxième élément soit réellement une Action correcte, de sorte que GetMethod (...) (...) fonctionne réellement?

Répondre

1

Appelez le ExportedDelegate.CreateDelegate. Passez le type de délégué que vous voulez (c'est-à-dire Action). MEF utilise ExportedDelegate pour que vous ne soyez pas limité à l'utilisation de l'action <> et Func <> délégués, mais pouvez utiliser n'importe quel type de délégué avec une signature correspondante.

Vous devez également spécifier le nom du contrat dans la contrainte que vous transmettez au constructeur ImportDefinition, au lieu de simplement passer le a => true.

+0

Donc pour clarifier, mon scénario (using GetMethod (...) (...)) ne fonctionnera jamais, car je devrais connaître le délégué exact que je cherche? Je ne peux pas juste dire à ExportedDelegate d'être appelé avec les arguments qu'il est passé? – Jamie

+0

Non, à un certain point, vous devez savoir quel type de délégué doit être. –

+0

Très bien. Pas la réponse que j'espérais, mais rien ne peut être fait à ce sujet. – Jamie