如何在C#中创建通用数字解析器?

Lou*_*hys 11 .net c# string parsing numbers

要将字符串解析为int,一个调用Int32.Parse(string)double Double.Parse(string),for long,for Int64.Parse(string),等等.

例如,是否可以创建一种使其成为通用的方法ParseString<T>(string)?在那里T可以Int32,Double等我发现的种类数量没有实现任何通用的接口,和Parse方法没有任何共同的父.

有没有办法实现这个或类似的东西?

Jon*_*eet 13

您基本上必须使用反射来查找相关的静态Parse方法,调用它并将返回值强制转换回来T.或者,您可以使用Convert.ChangeType或获取相关TypeDescriptor和相关的TypeConverter.

更有限但有效(并且在某些方面更简单)的方法是将字典从类型保存到解析委托 - 将委托转换为a Func<string, T>并调用它.这将允许您为不同类型使用不同的方法,但您需要知道转换为预先所需的类型.

无论你做什么,你都无法指定一个通用约束,它会在编译时使其安全.真的,你需要像我这样的静态接口的想法.编辑:如上所述,有IConvertible界面,但这并不一定意味着你将能够转换string.另一种类型可以实现,IConvertible而无需从字符串转换为该类型.


Sim*_*ier 5

实际上,标准数字类型确实实现了一个公共接口:IConvertible。这是Convert.ChangeType使用的那个。

不幸的是,没有TryParse等效项,如果无法解析字符串,它将抛出异常。

顺带一提,BCL团队似乎完全忘记了整个“转换”区域。自.NET Framework 1以来,这里没有任何新内容(TryParse方法除外)。