我有一個用於將字符串解析爲其他類型的泛型方法(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