如何将2个generics类型传递给扩展方法

我创建了以下扩展方法

public static T Map(this TEntity entity) where TEntity : IEntity { return Mapper.Map(entity); } 

这允许以下内容

 Db.ExchangeSets.FirstOrDefault().Map() 

但是我想知道无论如何我可以修改扩展方法,所以我可以调用如下的缩短版本

 Db.ExchangeSets.FirstOrDefault().Map() 

请注意 :

是否应该像这样使用automapper不在问题的范围内,它更像是一个事实发现任务


更新

对于那些在家里玩的人,在scotts评论的帮助下,我设法在autneric 扩展方法中找到了上述函数的额外求解

 public static T Map(this IEntity entity) { return (T)Mapper.Map(entity, entity.GetType(), typeof(T)); } 

但是除了AutoMapper之外,这不是实际问题的答案,而是相应地标记优点

如果你想知道为什么这是不可能的,我认为问题在于含糊不清:

 public static T Map(this TEntity entity) where TEntity : IEntity { return Mapper.Map(entity); } public static T Map(this ExchangeSet set) { // ... } 

那么,调用哪种方法? 请记住,这只是一个简单的例子。 很有可能未来可以实现部分类型推断,但我认为在重载解决方案中它太混乱,成本/收益将完全失控。 然后,这只是猜测。

你要求的是不可能的。 调用generics方法时,所有generics类型参数都必须可以从输入中输入,或者必须明确指定它们。 您的方法只有一个输入,因此您不可能推断出两个generics类型参数,因此必须始终明确指定它们。 您建议的代码意味着该方法只有一个generics类型参数,这将使它成为一个不同的方法。

如果引入第二个(链式)函数调用,则可以实现此目的:

 Db.ExchangeSets.FirstOrDefault().Map().To() 

推断的通用参数是一种全有或全无的交易; 如果没有足够的“实际”参数传递给方法,以便编译器找出所有通用参数,编译器会强制您手动指定每个通用参数。

为了能够使用上面的代码片段,您需要使用一个(唯一的)推断的generics参数进行一次方法调用,并使用一个手动指定的generics参数进行一次方法调用。

To<>方法可以像这样实现:

 public static MapExtensionHelper Map(this TEntity entity) where TEntity : IEntity { return new MapExtensionHelper(entity); } public class MapExtensionHelper where TEntity : IEntity { public MapExtensionHelper(TEntity entity) { _entity = entity; } private readonly TEntity _entity; public T To() { return Mapper.Map(_entity); } }