2016-10-28 1 views
0

J'ai type personnalisé nommé LocalizedString et je dois mettre en œuvre l'interface IConvertible depuis quand nous SERIALIZE types à notre DB, nous utilisons Convert.ChangeType et je ne peux pas changer cette partie du code.implémentant l'interface IConvertible

Ce que je fait est que je mis en œuvre:

string IConvertible.ToString(IFormatProvider provider) 
    { 
     return string.Format(this.ToString()); 
    } 

    object IConvertible.ToType(Type conversionType, IFormatProvider provider) 
    { 
     return Convert.ChangeType(this.ToString(), conversionType); 
    } 

    public TypeCode GetTypeCode() 
    { 
     return TypeCode.Object; 
    } 

et je quittais toutes les autres méthodes avec NotImplementedException depuis que je n'ai pas de conversions raisonnables pour d'autres types. (Je vais finir par faire les jeter InvalidCastException, mais c'est une autre histoire.)

Cependant, je reçois encore quand j'invoque Convert.ChangeType(val, pr.__property.PropertyType)val = "", pr.__property.PropertyType = {Name = "LocalizedString" FullName = "Sampo.CMS.LocalizedString"} Code avec crashe:

non valide cast de « System.String 'à' Sampo.CMS.LocalizedString '.

De quoi ai-je besoin pour en faire plus? Je suis coincé.

Répondre

1

Si vous regardez le MSDN System.IConvertable example, vous verrez qu'ils ont utilisé Convert.ChangeType dans leur implémentation, mais c'est parce qu'ils transmettent un double à convertir. Convert.ChangeType n'aura aucune idée de la façon de convertir vers ou depuis votre type d'objet personnalisé. Je suis sûr que vous devez mettre en œuvre la conversion à l'intérieur que tels que:

object IConvertible.ToType(Type conversionType, IFormatProvider provider) 
{ 
    if (conversionType == typeof(Sampo.CMS.LocalizedString)) 
    { 
     // Do your conversion here and return the string. 
     return this.ToString() + "!!!!"; 
    } 

    throw new InvalidCastException($"Converting type \"{typeof(LocalizedString)}\" to type \"{conversionType.Name}\" is not supported."); 
} 

Vraiment, pour le reste des 16 ou si les méthodes que vous devez mettre en œuvre vous pourriez probablement jeter InvalidCastExceptions pour eux aussi ..

De même, existe-t-il une raison pour laquelle vous faites la chaîne string.Format (this.ToString()) dans l'implémentation IConvertable.ToString? Vous ne lui passez aucun paramètre, alors ne devrait-il pas juste être retourner this.ToString()?


Voici quelques liens utiles peut-être:

Type conversion example in C# .NET using the IConvertible interface

System.Convert source de une version. Il a la source pour Convert.ChangeType afin que vous puissiez jeter un coup d'oeil et voir ce qu'il fait réellement et pourquoi cela ne fonctionnera pas.