2013-03-16 61 views
0

我試圖從c#中的字符串動態地將變量轉換爲任何類型。這裏有一個例子:從字符串中鑄造類型

string str = "System.Int32"; 
Type t = System.Type.GetType(str); 
string v = "100"; 
System.Int32 x = Convert.ChangeType(v,t); 

是在設計時顯示的錯誤是:「詮釋」

不能鍵入「對象」隱式轉換爲存在明確的轉換(您是否缺少演員?)

完成此操作的最簡單方法是什麼?我意識到上面的例子顯示了轉換爲int32,但這僅僅是一個例子。我不知道類型提前。對於我原來的問題沒有說清楚,我表示抱歉。

+4

'System.Int32 X =(System.Int32)Convert.ChangeType(V,T);' – 2013-03-16 01:53:01

+1

約翰是正確的,應該加上自己的評論作爲答案。您在轉換呼叫時缺少演員表。 – Parker 2013-03-16 01:53:38

+0

但是,如果你知道'v'將是一個'int',那麼在'string'中獲取類型的意義何在?顯然,在這種特殊情況下你根本不需要't'。 – hattenn 2013-03-16 01:57:04

回答

1

ChangeType函數返回類型爲Object。您需要顯式轉換爲Int32

System.Int32 x = (System.Int32)Convert.ChangeType(v,t); 

夫婦的其他小點

  • 它更習慣使用這個名字的int,而不是System.Int32
  • 代替"System.Int32"使用typeof(int).FullName
+0

我很抱歉沒有更具體,但我不知道我是什麼類型提前鑄造。 – Richard 2013-03-16 02:44:50

0

如果你知道你想轉換的類型,你應該把它轉換爲該類型:

int x = (int)Convert.ChangeType(v, t); 

它也可能是不錯的有一個通用的方法來執行轉換爲您提供:

public static class ConvertHelper 
{ 
    public static T ChangeType<T>(string value) 
    { 
     return (T)Convert.ChangeType(value, typeof(T)); 
    } 
} 

... 

int x = ConvertHelper.ChangeType<int>(v); 
+0

我不知道我要提前什麼類型的演員。 – Richard 2013-03-16 16:44:44

+0

該方法的返回類型是'object',因此您將無法將結果分配給整數變量。轉換工作,但存儲它的變量必須與方法返回類型兼容。只需將該變量更改爲「對象」即可。 – Dan 2013-03-16 23:00:52

0

你可以做一個赫普勒方法,使之更容易一點

public T ConvertTo<T>(object obj) where T : IConvertible 
{ 
    try 
    { 
     return (T)Convert.ChangeType(obj, typeof(T)); 
    } 
    catch 
    { // handle as needed/required 
    } 
    return default(T); 
} 

用法:

string v = "100"; 
int value = ConvertTo<int>(v); 

或擴展方法:

public static class Extensions 
{ 
    public static T ConvertTo<T>(this object obj) where T : IConvertible 
    { 
     try 
     { 
      return (T)Convert.ChangeType(obj, typeof(T)); 
     } 
     catch 
     { // handle as needed/required 
     } 
     return default(T); 
    } 
} 

用法:

string v = "100"; 
int value = v.ConvertTo<int>(); 
+0

我對沒有更具體的道歉表示歉意,但我不知道我會提前投入什麼。 – Richard 2013-03-16 02:16:05