使用连续的TryParse调用是一种猜测字符串’真实类型’的合理方法吗?
这涉及到我有没有使用T4生成类的项目模板? 题。 我有生成正确类型类属性所需的字符串( nvarchar
)参数值列表。
这些值都是原语 – 最复杂的是DateTime
– 在集合{ int
, double
, bool
, DateTime
}中。 目前我手工编码的类型属性为多个 – 这样的列表,并解析我从DateTime.TryParseExact
开始的字符串。 如果失败了,我尝试Double.TryParse
,在底部我放弃猜测并假设它确实是一个字符串。
这是一个相当合理的方法,还是我应该使用其他更复杂或更准确的方法?
如果这组值只是[double, DateTime, bool]
这将是一个详尽但相当合理的方法。 这些集之间只有如此重叠( true
总是一个bool
而5
绝不是一个bool
)。
同时使用int
和double
会使这个命题有点不稳定,因为存在大量重叠。 基本上任何int
也可以看作是double
。 如果它出现在值集中,我如何解释例如4
? 它可以被解释为两种方式,如果值随时间变化,您可以看到生成的代码的类型也在变化。
考虑一个列是否总是简单地重合整数。 因此,您生成了int
值并编写了一些依赖于它们的代码。 然后大约一个月左右,添加了一个非整数,突然间你正在吐出double
值。 这可能会对您的代码产生重大影响。
我个人采取的方法是简单地使用另一个表格来确定内容的类型。
看看Convert.ChangeType
和TypeDescriptor.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
希望这可以帮助。