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