2

我正在寻找一种将字符串转换为类型的通用方法。
例如:

class SomeThing<T> {

    public void Add(T value) {
       //...
    }

    public void Add(string value) {
        // Try to convert from string to T ???
    }
}

用法:

SomeThing<double> list = new SomeThing<double>();
list.Add(123.45);
list.Add("234.56");

它应该具有以下特性:
- 如果类型支持从字符串转换,则将其转换。
- 如果类型不支持从字符串转换,则抛出异常或返回default(T)
- 对于数字 (double, int),它应该使用不变的文化。

我怎样才能做到这一点?

4

3 回答 3

1

你可以试试这个

class SomeThing<T>
{

    public void Add(T value)
    {
        //...
    }

    public void Add(string value)
    {
        try
        {
            T typedValue;
            typedValue = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(value);
            //Call Add with the converted value
            this.Add(typedValue);
        }
        catch
        {
            throw;
        }
    }
}

如果要 Add 返回默认值,请使用以下命令:

class SomeThing<T>
{

    public void Add(T value)
    {
        //...
    }

    public void Add(string value)
    {
        try
        {
            T typedValue;
            typedValue = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(value);
            //Call Add with the converted value
            this.Add(typedValue);
        }
        catch
        {
            this.Add(default(T));
        }
    }
}
于 2013-08-02T08:06:56.287 回答
1

你可以尝试做这样的事情:

public void AddRange(string value) {
  var converter = TypeDescriptor.GetConverter(typeof(T));

  if (!Object.Reference(converter, null))
    if (converter.CanConvertFrom(typeof(String)) {
      T result = (T) converter.ConvertFrom(value);

      // value is converted to T; your code here   
      ...

      return; 
    } 

  // Type T can't be obtained from String directly
  //   1. Do it using by-ways (spesific for particular T's)
  //   2. Use default(T)  
  //   3. Throw exception
  ... 
于 2013-08-02T07:32:30.127 回答
0

如果您需要像示例中那样将 String 转换为 Double :

String myString = "123456";
Double myDouble
Double.TryParse(text, out myDouble); 

TryParse 不仅在 Double 类型上。

于 2013-08-02T09:23:36.543 回答