我有一个用于将字符串解析为其他类型的泛型方法(ParseTo)。这种方法收到包含方法执行委托类型参数:从接收委托类型参数的方法调用具有不同签名的方法
public delegate bool ParseToDelegate<T>(string value, out T result);
public static T? ParseTo<T>(this string value,
ParseToDelegate<T> method) where T : struct
{
T result;
if (String.IsNullOrWhiteSpace(value)) return null;
if (method(value, out result)) return result;
return null;
}
这工作得很好,因为的TryParse的签名是不是所有的基本类型相同。
var s = "1234,567";
Console.WriteLine(s.ParseTo<int>(int.TryParse)); //Error. Returns null
Console.WriteLine(s.ParseTo<decimal>(decimal.TryParse)); //Ok
var d = "14/05/2011 19:45";
Console.WriteLine(d.ParseTo<DateTime>(DateTime.TryParse)); //Ok
var g = Guid.NewGuid().ToString();
Console.WriteLine(g.ParseTo<Guid>(Guid.TryParse)); //Ok
我的问题是:现在我想扩展这个方法来支持不同的文化......但是,数字类型和日期类型具有不同的特征:
bool TryParse(string s, NumberStyles style, IFormatProvider provider, out int result);
bool TryParse(string s, IFormatProvider provider, DateTimeStyles styles, out DateTime result);
是有办法'映射'收到的委托并调用正确的方法?事情是这样的:
if (typeof(T) == typeof(DateTime))
{
//Call DateTime.TryParse(string s, IFormatProvider provider,
//DateTimeStyles styles, out DateTime result)
}
else
{
//Call DateTime.TryParse(string s,
//NumberStyles style, IFormatProvider provider, out int result);
}
这是一个性能问题。 –
使用Convert.ChangeType或TypeConverter.ConvertFromString,您必须在运行时检查异常。与TryParse相比,这会产生100倍的超额成本:-) –
@Iluis:理解 - 所以您确实需要频繁解析失败? – BrokenGlass