【问题标题】:Is there a way to write an Extension Method that applies to multiple types?有没有办法编写适用于多种类型的扩展方法?
【发布时间】:2010-01-02 07:48:28
【问题描述】:

我正在尝试编写一个扩展方法,它将函数 HasFactor 添加到 C# 中的类 int 中。这非常有效,就像这样:

static class ExtendInt
{
    public static bool HasFactor(this int source, int factor)
    {
        return (source % factor == 0);
    }
}

class Program
{
    static void Main()
    {
        int i = 50;
        int f = 2;
        bool b = i.HasFactor(f);
        Console.WriteLine("Is {0} a factor of {1}? {2}",f,i,b);
        Console.ReadLine();
     }
}

这很好用,因为上面Main() 方法中的变量i 被声明为int。但是,如果 i 被声明为 Int16Int64,则扩展方法不会显示,除非它显式转换为 intInt32

我现在想对Int16Int64 应用相同的HasFactor 方法。但是,我宁愿不为int 的每种类型编写单独的扩展方法。我可以Int64 编写一个方法,然后将所有内容显式转换为Int64long,以便出现扩展方法。

理想情况下,我希望将相同的扩展方法应用于所有三种类型,而无需复制和粘贴大量代码。

这在 C# 中是否可行?如果不可行,是否有针对这种情况的推荐最佳实践?

【问题讨论】:

  • 基于 Eilon 和 Marc Gravell 的输入,我想我将为 Int64 类型创建一种扩展方法。这应该适用于我正在做的事情。

标签: c# .net types extension-methods


【解决方案1】:

不,这在 C# 中是不可能的。您必须为每种类型创建一个扩展方法。最接近的是有一个在接口上操作的扩展方法,但在这种情况下,没有 INumeric 接口或由各种数字类型实现的类似接口。

【讨论】:

  • 实际上,表达式树的一些复杂使用(和/或动态,如果你在 .NET 4.0 中)是可能的 - 在此处查看 Marc Gravel 对另一个 SO 问题的回答:stackoverflow.com/questions/1987136/…,和他的 MiscUtil 库。
  • 好吧,operators% 等)可以使用它——但不能使用扩展方法代码。所以我认为 (+1) Eilon 是事实。我怀疑未来还会出现许多非常相似的重载。
  • 这很有趣。我很想知道dynamic(或其他一些.NET 4.0 功能)是否可用于将扩展方法限制为特定类型。这已经完成了吗? (也许这应该是一个单独的 SO 问题)。
  • 这绝对是一个有趣的想法。不过,我认为即使是动态的,您也希望该类型实现 IDynamicObject,这当然不是这里的选项,因为您不拥有相关类型(int、long 等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多