使用连续的TryParse调用是一种猜测字符串’真实类型’的合理方法吗?

这涉及到我有没有使用T4生成类的项目模板? 题。 我有生成正确类型类属性所需的字符串( nvarchar )参数值列表。

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

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

如果这组值只是[double, DateTime, bool]这将是一个详尽但相当合理的方法。 这些集之间只有如此重叠( true总是一个bool5绝不是一个bool )。

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

考虑一个列是否总是简单地重合整数。 因此,您生成了int值并编写了一些依赖于它们的代码。 然后大约一个月左右,添加了一个非整数,突然间你正在吐出double值。 这可能会对您的代码产生重大影响。

我个人采取的方法是简单地使用另一个表格来确定内容的类型。

看看Convert.ChangeTypeTypeDescriptor.GetConverter

我已经写了一个扩展方法来为我做这个:

 public static T Convert(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(this T obj) { return Nullable.GetUnderlyingType(typeof(T)) != null; } 

用法:

 var itemsToConvert = new[] { "4", "5.98", "false", DateTime.Now.ToString() }; var @int = itemsToConvert[0].Convert(); var @double = itemsToConvert[1].Convert(); var @bool = itemsToConvert[2].Convert(); var @dateTime = itemsToConvert[3].Convert(); 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,类型:System.Double
bool:False,Type:System.Boolean
DateTime:2013/08/21 06:01:07 PM,类型:System.DateTime

希望这可以帮助。