将字符串转换为未知基元类型(最佳猜测)

时间:2013-02-11 14:51:38

标签: c# .net type-conversion string-parsing

显然,除非你处于无助状态,否则这不是你想要做的事情,但是有没有人有这样一个很好的例子(考虑更清晰的方法名称的奖励积分):

public static object ConvertToBestGuessPrimitive(string toConvert)
{
    if(looksLikeAnInt)
    {
        return as an int;
    }
    else if(looksLikeABoolean)
    {
        return as a boolean;
    }
    else
    {
        return as a string;
    }
}

我唯一的想法是将一堆TryParse方法以合理的顺序链接在一起,如果没有任何效果则回退到字符串。谁能想到更好的东西?这个问题可能已经在某个地方得到了解答,但我似乎无法找到任何有用的结果,而且使用的是过于通用的搜索词。

编辑 - 因为有一些批评说如果没有一个例子,这将是多么有用,这里有一个我想出来满足一个具体的需求(但不可信)...说我正在解析我得到的错误日志文件一个不受控制的来源。日志文件具有为发生错误的位置提供的方法名称和参数。我想通过找到最匹配的方法和参数并尝试再次调用它们来自动测试错误条件。也许是一个愚蠢的例子(请不要尝试并提出“但你可以在这种情况下做到这一点”回复,因为这只是一个例子),但它说明了几点:1)输入是我无法控制的。 2)最佳猜测基于找到合适匹配的一些标准。例如:“10/2/2012”更可能意味着DateTime而不是字符串。

2 个答案:

答案 0 :(得分:1)

所以你想摆脱if-else?这样的事情怎么样:

interface IConverter
{
  bool TryConvert(string obj, out object result);
}

class IntConvert : IConverter
{
  public bool TryConvert(string obj, out object result) { /* stuff here */ }
}

class BoolConverter : IConverter {...}

// etc.
List<IConverter> converters = new List<IConverter>();
converters.Add(new IntConvert());
converters.Add(new BoolConvert());

public static object ConvertToBestGuessPrimitive(string toConvert)
{
  object obj;
  foreach(var converter in converters) {
    if(converter.TryConvert(toConvert, out obj))
       return obj;
  }

  return null;
}

更新:感谢调查的建议。

答案 1 :(得分:0)

实际上,尝试解析是最合理的方式,因为解析是特定于文化的。如果您只是要求.NET Framework进行解析,您将自动遵循当前的区域性设置。这与手动解析方法(可能基于正则表达式)形成对比。

另外,我不知道在bool,int,float和DateTime中可以解释的任何字符串。 (明显的例外是任何int也是一个浮点数,所以先解析int)。

更好的名称是ConvertToBestGuessPrimitiveType。我添加了“类型”。