为简单值制作(更)通用的转换器

本文关键字:转换器 简单 | 更新日期: 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);