【问题标题】:Making a (more) general converter for simple values [duplicate]为简单值制作(更)通用转换器[重复]
【发布时间】:2016-03-30 23:10:30
【问题描述】:

我使用以下两种扩展方法将传入的字符串转换为我需要的字符串。它们用于已转换为字符串但原始类型始终已知的数据。

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); }
}

完全可以做到吗,还是我最终会创建许多类似的扩展方法?请记住,由于我将始终知道所提供的类型,因此我只需要介绍这些类型,以防无法实现完全通用且类型安全的方法,或者非常麻烦。

另外,请注意我昨天做了手术,我还有点休息,所以答案可能很简单。

【问题讨论】:

    标签: c# generics type-conversion


    【解决方案1】:

    按照another question's answer 的思路,您可以使用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);
    

    【讨论】:

    • 我冒昧地对这种情况进行了一些调整。希望你喜欢。另外,您现在可能想删除评论。
    • 显然,我忘记检查您的答案是否已接受。我的错。我想,迟到总比没有好。你应该提醒的。投票系统对于质量保证至关重要,即使人们感觉像是在提醒投票时唠叨不休。这让我想到了我的部分 - 如果您发现这个问题很有趣且有益,请不要忘记投票。
    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 2016-06-06
    • 2020-06-05
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多