2016-10-28 4 views
0

を実装します。私が何をしたかは私がLocalizedString</em><em>という名前のカスタムタイプを持っていると私たちは私たちのDBへの種類をシリアル化するとき、我々はConvert.ChangeType</strong><strong>を使用して、私はこのコードの一部を変更することはできませんので、<em>IConvertible</em>インタフェースを実装する必要がIConvertibleインターフェイス

は私が実装されています。

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; 
    } 

と私は他の種類のいずれかの合理的な変換を持っていけないので、私はNotImplementedExceptionと他のすべてのメソッドを残しました。 (私は最終的に彼らがInvalidCastExceptionがを投げるようになりますが、thatsのまた別の話。)

私はConvert.ChangeType(val, pr.__property.PropertyType)どこval = ""を起動したときに、私はまだ受け取っしかし、pr.__property.PropertyType = {Name = "LocalizedString" FullName = "Sampo.CMS.LocalizedString"}コードがでクラッシュ:

可能System.String「から無効なキャスト'〜' Sampo.CMS.LocalizedString '。

さらに何をする必要がありますか?ハマった。

答えて

1

MSDN System.IConvertable exampleを見ている人は、Convert.ChangeTypeをその実装に使用していましたが、変換するために2倍に渡っているためです。 Convert.ChangeTypeは、あなたのカスタムオブジェクトタイプへの変換方法やカスタムオブジェクトタイプからの変換方法を知らないでしょう。私はあなたが内部変換を実装する必要があります確信していることなど:

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."); 
} 

本当に、16かそこらのメソッドの残りのためにあなたはおそらく同様にそれらのためのInvalidCastExceptionsを投げることができますを実装する必要があります。..

また、IConvertable.ToString実装でstring.Format(this.ToString())を実行する理由がありますか?パラメータを渡していないので、に戻してください.ToString()?いくつかのバージョンから

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

System.Convert source:ここ


は、いくつかの可能性が役に立つリンクです。 Convert.ChangeTypeのソースがありますので、実際に何が行われているのか、なぜそれが機能しないのかを見ることができます。

関連する問題

 関連する問題