J'ai le modèle d'interface de classe suivante sur laquelle je veux utiliser MEF exportation et l'exportation:Pourquoi le modèle Import/Export suivant avec des interfaces n'est pas légal?
public interface IDinosaur
{
string Species { get; }
}
public class Pterodactyl : IDinosaur
{
public string Species { get; set; }
public float WingSpan { get; set; }
}
public interface ICage<in T>
{
void Transport(T animal);
}
[Export(typeof(ICage<IDinosaur>))] // <-- This appears a problem
public class PterodactylCage : ICage<Pterodactyl>
{
public void Transport(Pterodactyl dinosaur) { }
}
public class DinoTransportationService
{
[Import(AllowDefault = true)]
private ICage<IDinosaur> m_dinosaurCage = null;
}
Maintenant, je dirais que cela est légal, comme les [Export(typeof(ICage<IDinosaur>))]
indeeds exporte la ICage
d'un IDinosaur
(qui se trouve être un Pterodactyl
, mais ceci implémente l'interface de dinosaure alors cela devrait être bien non?). Cependant, cela me donne une CompositionException. disant:
"The export 'PterodactylCage (ContractName=\"ICage(IDinosaur)\")' is not assignable to type 'ICage`1[[IDinosaur, MyProgramme, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'."
je pourrais corriger cela en changeant l'exportation vers:
[Export(typeof(ICage<Pterodactyl>))] // <-- This is ok
public class PterodactylCage : ICage<Pterodactyl>
Et l'importation:
[Import(AllowDefault = true)]
private ICage<Pterodactyl> m_dinosaurCage = null;
Sauf, que l'importation devient beaucoup trop spécifique, et En fait, dans mon cas, l'importation se fait dans un assemblage différent qui n'a jamais entendu parler des ptérodactyles, donc c'est une mauvaise solution. Pourquoi le premier exemple n'est pas légal, et quelle est la solution pour ce modèle?
Merci, cette explication est en effet une bonne explication de pourquoi ce qui précède n'est pas légal. Y at-il une alternative qui rend ce que je veux faire cependant? – Yellow
Bien ICage n'est pas ICage dans votre cas. Si vous réussissez d'une façon ou d'une autre à exporter et que quelqu'un a passé Theropods dans votre méthode de transport, il échouera lors de l'exécution. Donc, vous devriez revoir votre logique parce que ce que vous essayez de faire est tout simplement faux. –
Evk
Mais vous pouvez implémenter ICage au lieu de ICage et l'exporter. Vous pouvez vérifier à l'intérieur de la méthode de transport quel genre d'objet a été passé en IDinosaur ici (parce que cela peut être n'importe quel dinosaure à nouveau). –
Evk