2013-03-16 69 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