TryParse Nullable类型通常

我为以下Nullable类型编写了重载的静态TryParse方法: int?short? long?double?DateTime?decimal?float?bool?byte?char? 。 以下是一些实现:

 protected static bool TryParse(string input, out int? value) { int outValue; bool result = Int32.TryParse(input, out outValue); value = outValue; return result; } protected static bool TryParse(string input, out short? value) { short outValue; bool result = Int16.TryParse(input, out outValue); value = outValue; return result; } protected static bool TryParse(string input, out long? value) { long outValue; bool result = Int64.TryParse(input, out outValue); value = outValue; return result; } 

每种方法的逻辑都是相同的,只是它们使用不同的类型。 是不是可以使用generics,这样我就不需要那么多的冗余代码? 签名看起来像这样:

 bool TryParse(string input, out T value); 

谢谢

是不是可以使用generics,这样我就不需要那么多的冗余代码?

你可以用reflection来做,但这会相对缓慢。 否则,您可以创建一个从类型到“用于该类型的方法”的映射,但它会非常难看。 除了其他任何东西,它永远不会是真正的通用 – 它只适用于提供正确签名的TryParse方法的类型,这在编译时是无法知道的。

顺便说一下,我个人会考虑改变签名和行为。 目前,即使value的类型可以为空,即使返回false ,它也不会在方法结束时具有空值。 为什么不将返回值作为解析操作的结果,在失败时返回null

 protected static long? TryParseInt64(string input) { long outValue; return Int64.TryParse(input, out outValue) ? (long?) outValue : null; } 

您可以使用以下通用扩展方法,

 public static Nullable TryParse(this string input) where TSource : struct { try { var result = Convert.ChangeType(input, typeof(TSource)); if (result != null) { return (TSource)result; } return null; } catch (Exception) { return null; } } 

以下调用将返回可为空的解析类型。

 string s = "510"; int? test = s.TryParse(); //TryParse Returns 510 and stored in variable test. string s = "TestInt"; int? test = s.TryParse(); //TryParse Returns null and stored in variable test. 

顺便说一下,你可以重构你的代码:

 public static bool TryParse(string input, out int? value) { return TryParse(input, Int32.TryParse, out value); } protected static bool TryParse(string input, out short? value) { return TryParse(input, Int16.TryParse, out value); } protected static bool TryParse(string input, out long? value) { return TryParse(input, Int64.TryParse, out value); } private static bool TryParse(string input, TryParseFunc tryParse, out T? value) where T : struct { T outValue; bool result = tryParse(input, out outValue); value = outValue; return result; } private delegate bool TryParseFunc(string input, out T value);