2011-02-01 6 views
2

Je suis confronté à un problème que je n'ai jamais rencontré auparavant avec le cast de type.Impossible de convertir un objet de type 'TextmlBatchDeleteDocument' en 'System.String'

Je suis en train de convertir un objet de type TextmlBatchDeleteDocument en System.String. J'ai donc implémenté un opérateur de conversion de type explicite pour gérer cela.

public override string ToString() 
{ 
    return string.Format("{0}{1}", this.Collection, this.Name); 
} 

public static explicit operator string(TextmlBatchDeleteDocument doc) 
{ 
    return doc.ToString(); 
} 

Succès, les travaux suivants.

TextmlBatchDeleteDocument doc = new TextmlBatchDeleteDocument("name", "/collection/"); 
string someString = (string)doc; 

Cependant je passe un objet de type List<TextmlBatchDeleteDocument> à une fonction tierce qui nécessite un objet à mettre en œuvre IList et elle finira par utiliser les objets dans la liste sous forme de chaînes. C'est là que j'ai des ennuis. Je reçois cette exception chaque fois que j'essaie d'appeler la fonction tierce.

Impossible de convertir l'objet de type 'NWDA_Common.Textml.TextmlBatchDeleteDocument' en type 'System.String'.

Si mes hypothèses sont correctes je passe la fonction d'un objet de type List<TextmlBatchDeleteDocument> mais il obtient jeté à IList qui sera ensuite traiter un objet dans ma liste que le type de base System.Object. J'ai fait un test pour confirmer cette théorie et obtenu la même exception. Si je lance d'abord mon objet de type List<TextmlBatchDeleteDocument> à System.Object alors essayez de faire un cast à une chaîne, il va lancer une exception.

TextmlBatchDeleteDocument doc = new TextmlBatchDeleteDocument("name", "/collection/"); 
object docAsObj = doc; 
string someString = (string)docAsObj; 

Est-ce qu'il ya quelqu'un qui sait comment résoudre ce problème ou suis-je coincé avec refactoring et de trouver une autre façon?

Répondre

4

Il semble que le composant tiers vraiment nécessite un IList où chaque élément est une chaîne - c'est ce dont vous aurez besoin pour le fournir. Les conversions ne sont pas appliquées de manière polymorphique. Il s'agit d'un choix de compilation basé sur le type de compilation de l'expression source. Fondamentalement, vous devrez effectuer vous-même la conversion pour chaque élément et transmettre une liste des éléments convertis au code tiers.

+0

C'est ce que je m'attendais à entendre, j'espérais juste qu'il y avait un truc à faire. – Wade

+0

+1. Vrai pour tous les opérateurs, conversions incluses. –

+0

Donc serais-je en droit de conclure qu'une fois l'objet converti en System.Object, il perd tous les opérateurs définis dans la classe enfant – Wade

Questions connexes