为简单值制作(更)通用的转换器
本文关键字:转换器 简单 | 更新日期: 2023-09-27 18:27:55
我使用了以下两种扩展方法来将传入字符串转换为我需要的字符串。它们用于已转换为字符串的数据,但原始类型为的数据总是已知的。
public static int ToInt(this string self)
{
try { return Convert.ToInt32(self); }
catch { return default(int); }
}
public static double ToInt(this string self)
{
try { return Convert.ToDouble(self); }
catch { return default(double); }
}
我刚刚了解到信息流将被扩展并包含其他类型。从长远来看,为每种方法添加一个新的扩展方法肯定会让人抓狂,更不用说代码冗余了。因此,我试图使其更为笼统。
public static T ToType<T>(this string self)
{
if (typeof(T) == typeof(int))
try { return Convert.ToInt32(self); }
catch { return default(int); }
}
然而,编译器在这方面存在问题(当然是关于类型)。我在第一次返回中尝试了类型转换,在第二次返回中使用了提供的类型,但问题仍然存在。
public static T ToType<T>(this string self)
{
if (typeof(T) == typeof(int))
try { return (T)Convert.ToInt32(self); }
catch { return default(T); }
}
它能完成吗?还是我最终会创建许多类似的扩展方法?请记住,由于我永远知道提供的是什么类型的服务,我只需要涵盖这些,以防完全通用和类型安全的方法不可能实现,或者非常麻烦。
另外,请注意,我昨天做了手术,现在还有点不舒服,所以答案可能简单得令人尴尬。
根据另一个问题的答案,您可以使用Convert.ChangeType()方法来完成此操作。
public static T Get<T>(this String self)
{
return (T)Convert.ChangeType(self, typeof(T));
}
或者更复杂的版本,在转换失败的情况下提供回退。
public static T Get<T>(this String self, T fallBack = default(T))
{
try { return (T)Convert.ChangeType(self, typeof(T)); }
catch { return fallBack; }
}
用法如下。
String source = ...
Guid guid = source.Get<Guid>();
int number = source.Get<int>(42);