2016-10-28 131 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的来源,所以你可以看一看,看看它在做什么以及为什么不起作用。