C# 有没有一种方法可以编写适用于多种类型的扩展方法?
我正在尝试编写一个扩展方法,将函数C# 有没有一种方法可以编写适用于多种类型的扩展方法?,c#,.net,types,extension-methods,C#,.net,Types,Extension Methods,我正在尝试编写一个扩展方法,将函数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
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
声明为Int16
或Int64
,则扩展方法不会显示,除非它显式转换为int
或Int32
现在我想对Int16
和Int64
应用相同的HasFactor
方法。但是,我不希望为每种类型的int
编写单独的扩展方法。我可以为Int64
编写一个方法,然后将所有内容显式转换为Int64
或long
,以便显示扩展方法
理想情况下,我希望将相同的扩展方法应用于所有三种类型,而不必复制和粘贴大量代码
这在C#中可能吗?如果不可能,是否有针对这种情况的推荐最佳做法?不,这在C#中是不可能的。您必须为每种类型创建一个扩展方法。最接近的方法是有一个在接口上操作的扩展方法,但在这种情况下,不存在由各种数字类型实现的INumeric接口或任何类似的接口。实际上,通过复杂地使用表达式树(和/或动态,如果您在.NET 4.0中)-在这里查看Marc Grasser对另一个SO问题的回答:,以及他的MiscUtil库。好的,操作符(
%
等)可以使用这个,但不能使用扩展方法代码。所以我认为(+1)艾隆知道真相。我想,未来会有很多类似的重载,这很有趣。我想知道是否可以使用dynamic
(或其他一些.NET4.0功能)将扩展方法限制为特定类型。这样做了吗?(也许这应该是一个单独的SO问题)。这绝对是一个有趣的想法。尽管如此,我认为即使使用dynamic,您也希望该类型实现IDynamiObject,这当然不是一个选项,因为您不拥有所讨论的类型(int、long等)。基于Eilon和Marc Gravell的输入,我想我将为typeInt64
创建一个扩展方法。这对我的工作应该有用。