正在使用连续的TryParse调用一种合理的方式来猜测字符串';s';真实类型';

本文关键字:方式 类型 真实 字符串 一种 连续 TryParse 调用 | 更新日期: 2023-09-27 18:28:33

这与我的有关。有没有使用T4生成类的项目模板?问题我有字符串(nvarchar)参数值的列表,需要为其生成正确类型的类属性。

这些值都是集合{intdoubleboolDateTime}中的基元,最复杂的是DateTime。目前,我已经为许多这样的列表中的一个手动编码了类型化属性,为了解析字符串,我从DateTime.TryParseExact开始。如果失败,我尝试Double.TryParse,在底部我放弃猜测,并假设它真的是一个字符串。

这是一个相当合理的方法,还是还有其他更复杂或更准确的方法我应该使用?

正在使用连续的TryParse调用一种合理的方式来猜测字符串';s';真实类型';

如果值集只有[double, DateTime, bool],这将是一个详尽但相当合理的方法。在这些集合之间存在简单的重叠(true总是bool,而5从来都不是bool)。

同时拥有intdouble使得这个命题有点不稳定,因为存在大量的重叠。本质上,任何CCD_ 16也可以被看作CCD_ 17。例如,如果4出现在值集中,我该如何解释?它可以用两种方式解释,如果值随时间变化,您可以看到生成的代码的类型也在变化。

考虑一下一列是否总是有整数,只是巧合。因此,您生成了int值,并编写了一些代码,这些代码依赖于它们是int。大约一个月后,添加了一个非整数,突然您就吐出了double值。这可能会对您的代码产生不小的影响。

就我个人而言,我会采取的方法是简单地使用另一个表来指定内容的类型。

看看Convert.ChangeTypeTypeDescriptor.GetConverter

我已经为自己编写了一个扩展方法:

public static T Convert<T>(this object obj)
{
  T result;
  try
  {
    result = (T)System.Convert.ChangeType(obj, typeof(T));
    if (object.ReferenceEquals(result, null))
    {
      var typeConverter = !obj.IsNullable()
        ? TypeDescriptor.GetConverter(typeof(T))
        : new NullableConverter(typeof(T));
      result = obj is string
        ? (T)typeConverter.ConvertFromString(obj as string)
        : (T)typeConverter.ConvertTo(obj, typeof(T));
    }
  }
  catch (Exception)
  {
    result = default(T);
  }
  return result;
}
public static bool IsNullable<T>(this T obj)
{
  return Nullable.GetUnderlyingType(typeof(T)) != null;
}

用法:

var itemsToConvert = new[] { "4", "5.98", "false", DateTime.Now.ToString() };
var @int = itemsToConvert[0].Convert<int>();
var @double = itemsToConvert[1].Convert<double>();
var @bool = itemsToConvert[2].Convert<bool>();
var @dateTime = itemsToConvert[3].Convert<DateTime>();
Console.WriteLine(@"int: {0}, Type: {1}", @int, @int.GetType());
Console.WriteLine(@"double: {0}, Type: {1}", @double, @double.GetType());
Console.WriteLine(@"bool: {0}, Type: {1}", @bool, @bool.GetType());
Console.WriteLine(@"DateTime: {0}, Type: {1}", @dateTime, @dateTime.GetType());

输出:

int:4,类型:System.Int32
double:5.98,类型:系统。double
bool:False,类型:System.Boolean
日期时间:2013/08/21 06:01:07 PM,类型:System.DateTime

希望这能有所帮助。