2011-02-10 27 views
1

我用下面的代碼從一個字符串返回一個對象的一個​​問題:C#TypeConverter.ConvertFrom()的問題

[TypeConverter(typeof(MyConverter))] 
public class MyClass 
{ 
    public string s; 
} 

public class MyConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return (sourceType == typeof(string)) ? true : base.CanConvertFrom(context, sourceType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     if (value is string) 
     { 
      MyClass m = new MyClass(); 
      m.s = (string)value; 
      return m; 
     } 

     return base.ConvertFrom(context, culture, value); 
    } 
} 

當我嘗試使用此代碼的使用方法:

string s_test = "test"; 

MyClass m_test; 

m_test = (MyClass)Convert.ChangeType(s_test, typeof(MyClass)); 

我得到錯誤信息

從'System.String'到 'MyClass'的轉換無效。

什麼是錯在我的代碼? 注意,我必須使用ConvertFrom()方法...

預先感謝您的幫助。

堆棧跟蹤:

[InvalidCastException: Invalid cast from 'System.String' to 'MyClass'.] 
    System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider) +9496632 
    System.String.System.IConvertible.ToType(Type type, IFormatProvider provider) +8 
    System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) +9531720 
    System.Convert.ChangeType(Object value, Type conversionType) +32 
    OrderController.Index() in [...].cs:70 
    ... omitted for brevity ...
+0

什麼是堆棧跟蹤? – SLaks 2011-02-10 16:02:41

回答

8

你希望Convert.ChangeType使用TypeConverter如果存在 - 它沒有。 TypeConverter通常與TypeDescriptor結合使用(通常在隱含UI框架)。

+0

是的你是對的,我的問題來自Telerik ASP MVC Grid control ...查看我的最新評論 – mbp 2011-02-10 16:15:23

3

你似乎是的印象是Convert.ChangeType尋找一個TypeConverter下。它沒有。

the MSDN doc:「對於轉換成功,值必須實現IConvertible接口」

由於System.String沒有實現IConverter<MyClass>,你的運氣了(與Convert類,反正)。像飛碟雙向說(and MSDN),使用TypeDescriptor代替。

+0

好的,謝謝你的回答。 實際上,我想使用Telerik Grid MVC中的DisplayTemplate http://www.telerik.com/help/aspnet-mvc/telerik-ui-components-grid-display-and-editor-templates.html和I得到相同的錯誤信息從'System.String'轉換爲'MyClass'無效,所以我試圖瞭解Telerik是做什麼和失敗的... 有沒有人有想法? – mbp 2011-02-10 16:08:58

3

號樓開來喬恩斯基特正確的答案,你需要使用TypeDescriptor做轉換。

string s_test = "test"; 
MyClass m_test; 
m_test = (MyClass)Convert.ChangeType(s_test, typeof(MyClass)); 

要:從改變你的測試代碼

string s_test = "test"; 
MyClass m_test; 
m_test = (MyClass)TypeDescriptor.GetConverter(typeof(MyClass)).ConvertFromString(test); 

,所有應該很好。

0

SixPack library具有TypeConverter類支持大多數的.NET轉換方法,包括的TypeConverter。所支持的轉換有以下幾種:

  • TypeConverter的源型
  • 類型轉換器的目標類型
  • C#顯性和隱性的鑄造運營商
  • IConvertible

也有特殊待遇以下類型

  • 的DBNull
  • 可空
  • 枚舉
  • 時間跨度
2

(發現這個鏈接,同時尋找答案類似的問題,所以發帖最好的答案,我發現)

隱含明確運營商似乎是你想要的,TypeConverter是不需要的

public class MyClass 
{ 
    public string s; 

    public static explicit operator MyClass(string s) { 
     MyClass m = new MyClass(); 
     m.s = (string)value; 
     return m; 
    } 
} 

允許以下內容: -

string s_test = "test"; 

MyClass m_test; 

m_test = (MyClass)s_test; 

注:以上是未經測試,但應儘量接近,以給予必要的線索。