恰好两种不同类型的扩展方法
Extension method for precisely two different types
我正在使用下面的代码。它是为某种类型设计的,以限制它在智能感知等方面的弹出性。
public static Generic Get<Generic>(this Entity input)
{
return (Generic)input;
}
现在我想对另一种类型使用相同的 Get 方法(或者,为了完全覆盖,一些其他类型,但仍然是固定数量)。所以我添加了第二种方法,代码如下所示。
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;
}
C# 不支持 [Entity, Entity2]
表示法,因此该选项不可用。
如果 Entity
和 Entity2
共享一个公共接口或基 class,则将其声明为:
public static Generic Get<Generic>(this IEntityCommon input)
{
return (Generic)input;
}
如果没有并且您已经创建了Entity
、Entity2
等,则添加一个公共接口。该接口不需要定义任何方法,可以为空,它只是为扩展方法提供一个通用类型。
失败了,"CommonLogic" 方式是您最好的选择。
你可能会做那样的事情
public static TSearch Get<TSource, TSearch>(this TSource obj) where TSource : BaseType, ISomeInterface
{
}
T 现在只能是 BaseType
类型并实现 ISomeInterface
,但这将无法限制为受支持的修复计数 类
编辑:
您现在可以在实现 ISomeInterface
和 Return 请求类型 TSearch
的类型 BaseType
的对象上使用它。但是,您也可以只使用 where TSource : ISomeInterface
。线索是你的 Entity
类 实现了这个接口。
检查 where - generic type constratint 以了解如何使用它。
我正在使用下面的代码。它是为某种类型设计的,以限制它在智能感知等方面的弹出性。
public static Generic Get<Generic>(this Entity input)
{
return (Generic)input;
}
现在我想对另一种类型使用相同的 Get 方法(或者,为了完全覆盖,一些其他类型,但仍然是固定数量)。所以我添加了第二种方法,代码如下所示。
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;
}
C# 不支持 [Entity, Entity2]
表示法,因此该选项不可用。
如果 Entity
和 Entity2
共享一个公共接口或基 class,则将其声明为:
public static Generic Get<Generic>(this IEntityCommon input)
{
return (Generic)input;
}
如果没有并且您已经创建了Entity
、Entity2
等,则添加一个公共接口。该接口不需要定义任何方法,可以为空,它只是为扩展方法提供一个通用类型。
失败了,"CommonLogic" 方式是您最好的选择。
你可能会做那样的事情
public static TSearch Get<TSource, TSearch>(this TSource obj) where TSource : BaseType, ISomeInterface
{
}
T 现在只能是 BaseType
类型并实现 ISomeInterface
,但这将无法限制为受支持的修复计数 类
编辑:
您现在可以在实现 ISomeInterface
和 Return 请求类型 TSearch
的类型 BaseType
的对象上使用它。但是,您也可以只使用 where TSource : ISomeInterface
。线索是你的 Entity
类 实现了这个接口。
检查 where - generic type constratint 以了解如何使用它。