C# 精确两种不同类型的可拓方法

C# 精确两种不同类型的可拓方法,c#,extension-methods,C#,Extension Methods,我正在使用下面的代码。它是为特定类型设计的,以限制其在智能感知等方面的弹出性 public static Generic Get<Generic>(this Entity input) { return (Generic)input; } 公共静态泛型Get(此实体输入) { 返回(通用)输入; } 现在,我想对另一种类型使用相同的Get方法(或者,要完全介绍的是,还有一些其他类型,但仍然是固定数量的)。因此,我添加了第二个方法,代码如下所示 public static Ge

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

public static Generic Get<Generic>(this Entity input)
{
  return (Generic)input;
}
公共静态泛型Get(此实体输入)
{
返回(通用)输入;
}
现在,我想对另一种类型使用相同的Get方法(或者,要完全介绍的是,还有一些其他类型,但仍然是固定数量的)。因此,我添加了第二个方法,代码如下所示

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

public static Generic Get<Generic>(this Entity2 input)
{
  return (Generic)input;
}
公共静态泛型Get(此实体输入)
{
返回(通用)输入;
}
公共静态泛型Get(此Entity2输入)
{
返回(通用)输入;
}
我觉得更好的方法是将它保持在同一个方法体中,并且仍然覆盖所有的类型。签名中是否包含两种不同类型的语法?类似下面的伪代码

public static Generic Get<Generic>(this [Entity, Entity2] input)
{
  return (Generic)input;
}
public静态泛型Get(此[Entity,Entity2]输入)
{
返回(通用)输入;
}
我能想到的最好的方法,如下所示,包括每种类型的入口方法和私有位置的逻辑。当逻辑很广泛时,它是有意义的,但当它只有一两行时,它看起来有点多余

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;
}
公共静态泛型Get(此实体输入)
{
返回公共逻辑(输入);
}
公共静态泛型Get(此Entity2输入)
{
返回公共逻辑(输入);
}
专用静态通用通用逻辑(对象输入)
{
返回(通用)输入;
}
C#不支持
[Entity,Entity2]
符号,因此该选项不可用

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

public static Generic Get<Generic>(this IEntityCommon input)
{
    return (Generic)input;
}
public静态泛型Get(此IEntityCommon输入)
{
返回(通用)输入;
}
如果没有,并且您已经创建了
实体
实体2
等,则添加一个公共接口。这个接口不需要定义任何方法,可以是空的,它只是为扩展方法提供了一个公共类型


如果做不到这一点,“CommonLogic”方法是你最好的选择。

你可以做类似的事情

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

    }
publicstatictsearchget(这个TSource对象),其中TSource:BaseType,接口
{
}
T现在只能是
BaseType
类型,并实现
isomointerface
,但这不会使其限制为支持的类的固定计数

编辑:

现在,您可以在类型为
BaseType
的对象上使用它来实现
isomoInterface
,并返回请求的类型
TSearch
。但是,您也可以只使用
where-TSource:ISomeInterface
。线索是您的
实体
类实现了这个接口


检查以了解如何使用它。

我肯定会使用最后一种方法,或者将其放在对象上?Entity和Entity2之间有什么共同之处吗?您是否控制EntityX类的源代码?如果是这样,您可以创建一个标记(空)接口,并且只让那些类实现该接口。然后将“this”扩展方法参数类型设置为该接口。请在代码中使用
T
而不是
Generic
。这样一个简单的更改将使您的代码读取速度提高一个数量级@幸运的是,我删除了我的评论,但不,你不能这么做
其中T:Entity,Entity2
表示T必须实现Entity和Entity2,而不是Entity或Entity2。您不能继承多个类,只能继承接口。要使其正常工作,您需要两个泛型类型。输入和输出。现在,它接受某种类型的内容并返回相同的类型,这不是OPs代码所做的。@juharr它现在应该适合了(如果他的
实体
类是
基本类型
ISomeInterface
),您必须在方法
公共静态TSearch Get上指定
TSource
作为泛型类型(此TSource obj)
@CarbineCoder事实上,它现在甚至无法编译,因为它无法解析
TSource
是什么。@juarr Lol我只是重新阅读并删除了我的评论,该死的,你在我做之前就发现了。注释只是一个缩短解释的伪代码。这些类没有专用于它们的公共接口,因为他的逻辑很短,我想努力把事情做好是没有意义的。不过,在一般情况下知道这一点是好的。