我正在尝试将以下方法转换为IEnumerable的扩展方法:
private static IEnumerable<TTarget> MapList<TSource, TTarget>(IEnumerable<TSource> source)
{
return source.Select(
element =>
_mapper.Map<TSource, TTarget>(element)
).ToList();
}
现在这样称呼它:
var sourceList = new List<SourceType>();
return MapList<SourceType, TargetType>(sourceList);
但我想这样称呼它:
var sourceList = new List<SourceType>();
return sourceList.MapTo<TargetType>();
我尝试这样做:
public static IEnumerable<TTarget> MapTo<TTarget>(this IEnumerable<TSource> source)
{
return source.Select(
element =>
Mapper.Map<TSource, TTarget>(element)
).ToList();
}
但是我TSource
发现找不到类型或名称空间,因为它不包含在方法的类型参数列表中。我可以这样工作:
public static IEnumerable<TTarget> MapTo<TSource, TTarget>(this IEnumerable<TSource> source)
{
return source.Select(
element =>
Mapper.Map<TSource, TTarget>(element)
).ToList();
}
但是,我必须这样称呼它:
var sourceList = new List<SourceType>();
sourceList.MapTo<SourceType, TargetType>();
我感觉还不如sourceList.MapTo<TargetType>()
。
有什么办法可以做我想要的吗?
调用中没有足够的信息来完全确定要传递给的泛型类型参数MapTo
,并且C#不支持仅推断某些类型。您要么必须指定所有类型,要么都不指定。
但是,您可以通过重新设计界面来解决此问题。这只是一种解决方案:
public sealed class Mappable<TSource>
{
private readonly IEnumerable<TSource> source;
public Mappable(IEnumerable<TSource> source)
{
this.source = source;
}
public IEnumerable<TTarget> To<TTarget>()
{
return source.Select(
element =>
Mapper.Map<TSource, TTarget>(element)
).ToList();
}
}
public static class Extensions
{
public static Mappable<TSource> Map<TSource>(this IEnumerable<TSource> source)
{
return new Mappable<TSource>(source);
}
}
现在您可以这样称呼它:
var sourceList = new List<SourceType>();
var target = sourceList.Map().To<TargetType>();
另外,如果您放弃使用扩展方法,则可以这样做:
public static class MapTo<TTarget>
{
public static IEnumerable<TTarget> From<TSource>(IEnumerable<TSource> source)
{
return source.Select(
element =>
Mapper.Map<TSource, TTarget>(element)
).ToList();
}
}
并这样称呼它:
var sourceList = new List<SourceType>();
var target = MapTo<TargetType>.From(sourceList);
这些都不是特别优雅。如果您希望使用这种语法,而不是在每个调用中完全指定通用参数,则取决于您。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句