2011-08-17 2 views
3

Je reçois actuellement cette erreur d'un InvalidCastExceptionC#: Impossible de convertir type A au type B où A = B

[A]System.Data.Objects.ObjectResult`1[EDMXAssembly.ServiceStatus] cannot be cast to 
[B]System.Data.Objects.ObjectResult`1[EDMXAssembly.ServiceStatus]. 
Type A originates from 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089' in the context 'Default' at location 
'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.Entity\v4.0_4.0.0.0__b77a5c561934e089\System.Data.Entity.dll'. 
Type B originates from 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the 
context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.Entity\v4.0_4.0.0.0__b77a5c561934e089\System.Data.Entity.dll'. 

long et laid!

J'utilise la réflexion pour appeler une méthode dans un assembly qui est chargé au moment de l'exécution. La méthode que j'appelle renvoie ObjectResult<T>. L'erreur apparaît lorsque j'essaie d'afficher le résultat de l'invocation.

Je pense que cela est dû au fait que le moteur d'exécution contient une référence à System.Data.Entity, ainsi que l'assemblage qui effectue la réflexion et le moulage; Parce que ce sont deux références différentes, les types sont traités comme n'étant pas les mêmes. (À quelle distance suis-je là?)

Y at-il un moyen de contourner ce problème? La méthode que j'appelle est sur un ObjectContext, donc je ne peux pas changer ce qu'il retourne.

Merci

Modifier pour extrait:

public QueryResultSet<T> ObjectQuery<T>(string dataContext, string functionName, List<ObjectParameter> functionParameters) 
{ 
    var context = htContexts[dataContext]; 
    ObjectResult<T> qResult = (ObjectResult<T>)context.GetType().InvokeMember(functionName, BindingFlags.InvokeMethod, null, context, functionParameters.ToArray()); 

    return qResult; 
} 

L'erreur occurrs sur la ligne qResult (je suis juste se moquant ce vraiment rapidement au moment, où le manque d'try-catch)

+4

Montrez-nous un extrait du code où vous invoquez la méthode. – IAbstract

+3

Je suis sûr que votre analyse est correcte; Les types de deux charges différentes d'un assemblage sont considérés comme des types différents. – dlev

+0

Avez-vous essayé d'utiliser le mot-clé var et d'accéder aux propriétés de la classe? var foo = myClass.results(); –

Répondre

1

Ceci est un bon exemple de la raison pour laquelle vous devez conserver les interfaces dans une bibliothèque séparée commune. Vous devez utiliser une interface pour ObjectResult. De cette façon, votre ObjectResult peut avoir un contrat commun entre vos autres assemblys.

Modifier
Si vous n'êtes pas en mesure d'appliquer d'héritage à la source ObjectResult vous pourriez avoir à effectuer une réflexion plus approfondie sur l'objet retourné afin de convertir à votre ObjectResult. Attention: cela pourrait être une conversion coûteuse ...

... ou de refactoriser pour dériver une autre solution.

+0

Comment créer une interface pour 'ObjectResult' dans cette instance? Je ne suis pas capable de modifier ce que renvoie 'ObjectContext'. En théorie, 'ObjectResult' ne serait-il pas un contrat commun entre les assemblées? mais pour y avoir deux références ici. – AndyBursh

+0

Si vous avez un objet ObjectResult dans un assembly, il n'est pas égal à ObjectResult dans un autre assembly. – IAbstract

+0

J'ai remarqué. Donc, il n'y a pas vraiment un moyen de contourner cela? Temps de refactoring, peut-être? – AndyBursh

Questions connexes