精确两种不同类型的扩展方法

时间:2015-06-03 12:20:52

标签: c# extension-methods

我使用下面的代码。它是为特定类型而设计的,以限制它在智能感知等方面的弹出窗口。

public static Generic Get<Generic>(this Entity input)
{
  return (Generic)input;
}

现在我想对另一种类型使用相同的获取方法(或者,完全覆盖其他几种类型,但仍然是修复数)。所以我添加了第二种方法,代码如下所示。

public static Generic Get<Generic>(this Entity input)
{
  return (Generic)input;
}

public static Generic Get<Generic>(this Entity2 input)
{
  return (Generic)input;
}

令我感到震惊的是,更好的方法是将它保持在同一个方法体中,并且仍然涵盖所有被认为的类型。是否有包含例如的语法签名中有两种不同的类型?类似下面的伪代码

public static Generic Get<Generic>(this [Entity, Entity2] input)
{
  return (Generic)input;
}

我能想到的最佳方法,如下所示,包含每种类型的输入方法和私有位置的逻辑。当逻辑是广泛的时候它是有道理的,但当它只有一两行时看起来有点多余。

public static Generic Get<Generic>(this Entity input)
{
  return CommonLogic(input);
}

public static Generic Get<Generic>(this Entity2 input)
{
  return CommonLogic(input);
}

private static Generic CommonLogic(Object input)
{
  return (Generic)input;
}

2 个答案:

答案 0 :(得分:6)

C#不支持[Entity, Entity2]表示法,因此该选项已用完。

如果EntityEntity2共享一个公共接口或基类,则将其声明为:

public static Generic Get<Generic>(this IEntityCommon input)
{
    return (Generic)input;
}

如果没有,您已创建EntityEntity2等,则添加一个通用界面。此接口不需要定义任何方法,也可以为空,它只是为扩展方法提供了一个通用类型。

失败了,&#34; CommonLogic&#34;方式是你最好的选择。

答案 1 :(得分:3)

你可能会做那样的事情

    public static TSearch Get<TSource, TSearch>(this TSource obj) where TSource : BaseType, ISomeInterface
    {

    }

T现在只能是BaseType类型并且实现ISomeInterface,但是这不能使其可以被限制为受支持类的修复计数

修改

现在,您可以对实施BaseType的{​​{1}}类型的对象和返回请求类型ISomeInterface使用此功能。但是,您也可以使用TSearch。线索是你的where TSource : ISomeInterface类实现了这个接口。

检查where - generic type constratint以了解如何使用它。