2016-10-28 130 views
0

我有自定義類型命名爲LocalizedString,我需要實現IConvertible接口,因爲當我們序列類型,以我們的數據庫,我們使用Convert.ChangeType,我無法改變這部分代碼。實現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的,但那是另一回事。)

然而,當我調用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,但那是因爲他們傳遞了一個double來進行轉換。 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())的原因?你不通過它的任何參數,所以不應該只是是返回this.ToString()?


下面是一些可能有用的鏈接:

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

System.Convert source一些版本。它有Convert.ChangeType的來源,所以你可以看一看,看看它在做什麼以及爲什麼不起作用。