2012-02-24 29 views
3

你有什么替代这些代码,我希望有一个更通用的代码 我试着Convert类,但没有成功,如果你不存在将字符串转换为类型实例

 public object convert(Type type, string value) 
     { 
      object r = null; 
      if (type == typeof(bool)) 
      { 
       r = bool.Parse(value); 
      }    
      else if (type == typeof(int)) 
      { 
       r = int.Parse(value); 
      } 
      else if (type == typeof(string)) 
      { 
       r = value; 
      } 

      return r; 
     } 
+0

可能是一个很大的变化,但你可以(同时提出其他问题)通过使用动态摆脱整个问题。 – 2012-02-24 16:20:05

回答

7
var conv = TypeDescriptor.GetConverter(type); 
return conv.ConvertFromInvariantString(value); 

其他转换操作想要“不变”。这取决于你的需求。如果您想要应用区域设置,请参阅ConvertFromString等。

+0

thx,这些就是我在寻找的 – Said 2012-02-24 16:22:52

6

您提到您已尝试使用Convert类,但是您是否也试过Convert.ChangeType(value, type)?你碰到什么问题?

+0

是的,我试过这些,但是我不能投出结果的问题 – Said 2012-02-24 16:18:22

+0

该方法的结果作为'object'返回,就像你的方法一样。在某些时候,你将不得不经历一堆'if's,就像你的例子。不幸的是,你不能在某种类型上“开关”。 – 2012-02-24 16:23:25

0

如何创建一本词典Dictionary<Type, Func<string, object>>

也许是这样的:

public static class MyConverter 
{ 
    private static Dictionary<Type, Func<string, object>> _Converters; 

    static MyConverter() 
    { 
     _Converters = new Dictionary<Type, Func<string, object>>(); 

     // Add converter from available method 
     _Converters.Add(typeof(double), MySpecialConverter); 
     // Add converter as lambda 
     _Converters.Add(typeof(bool), (text) => bool.Parse(text)); 
     // Add converter from complex lambda 
     _Converters.Add(typeof(int), (text) => 
     { 
      if (String.IsNullOrEmpty(text)) 
      { 
       throw new ArgumentNullException("text"); 
      } 

      return int.Parse(text); 
     }); 
    } 

    private static object MySpecialConverter(string text) 
    { 
     return double.Parse(text); 
    } 

    public static object Convert(Type type, string value) 
    { 
     Func<string, object> converter; 

     if (!_Converters.TryGetValue(type, out converter)) 
     { 
      throw new ArgumentException("No converter for type " + type.Name + " available."); 
     } 

     return converter(value); 
    } 
}