如何在扩展方法中获取“ this”参数的泛型类型参数?

迈克·B

我正在尝试将以下方法转换为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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在扩展方法中获取“ this”参数的泛型类型参数?

来自分类Dev

Java泛型-获取泛型参数的实际类型

来自分类Dev

Java泛型-获取泛型参数的实际类型

来自分类Dev

快速获取泛型的参数化类型?

来自分类Dev

获取泛型类型参数的数量

来自分类Dev

如何在泛型方法中引用类型参数的值

来自分类Dev

如何检查泛型参数关联类型?

来自分类Dev

类型不接受泛型中的参数

来自分类Dev

Haxe中泛型类型参数的构造

来自分类Dev

捕获映射类型中的泛型参数

来自分类Dev

Java泛型:方法声明参数中的类型扩展

来自分类Dev

在TypeScript中,如何获取具有多个类型参数的方法中的泛型类型参数?

来自分类Dev

如何在 IEnumerable<object> 上获取泛型参数的类型?

来自分类Dev

如何从泛型定义和泛型参数获取泛型类型?

来自分类Dev

如何从泛型定义和泛型参数获取泛型类型?

来自分类Dev

如何获取泛型方法的每个参数的类型

来自分类Dev

如何从包含泛型参数的Type中获取“基本”类型?

来自分类Dev

如何在方法参数中使用泛型类型投影?

来自分类Dev

如何在Kotlin中获取经过修饰的泛型参数的实际类型参数?

来自分类Dev

从泛型类型类确定方法参数类型

来自分类Dev

如何提取泛型类型参数的数据类型?

来自分类Dev

参数类型模板类型中的泛型 lambda auto

来自分类Dev

以匿名类型作为泛型参数的泛型类型实例,如何正确转换回原始类型?

来自分类Dev

泛型方法从超类获取参数类型

来自分类Dev

如何在JAVA泛型中定义使用2个泛型参数扩展Map对象的类型?

来自分类Dev

调用泛型方法时如何推断参数类型?

来自分类Dev

无法匹配方法参数中的泛型类型

来自分类Dev

泛型-类型中的方法不适用于参数

来自分类Dev

泛型类型参数C#-如何泛型类返回类型

Related 相关文章

  1. 1

    如何在扩展方法中获取“ this”参数的泛型类型参数?

  2. 2

    Java泛型-获取泛型参数的实际类型

  3. 3

    Java泛型-获取泛型参数的实际类型

  4. 4

    快速获取泛型的参数化类型?

  5. 5

    获取泛型类型参数的数量

  6. 6

    如何在泛型方法中引用类型参数的值

  7. 7

    如何检查泛型参数关联类型?

  8. 8

    类型不接受泛型中的参数

  9. 9

    Haxe中泛型类型参数的构造

  10. 10

    捕获映射类型中的泛型参数

  11. 11

    Java泛型:方法声明参数中的类型扩展

  12. 12

    在TypeScript中,如何获取具有多个类型参数的方法中的泛型类型参数?

  13. 13

    如何在 IEnumerable<object> 上获取泛型参数的类型?

  14. 14

    如何从泛型定义和泛型参数获取泛型类型?

  15. 15

    如何从泛型定义和泛型参数获取泛型类型?

  16. 16

    如何获取泛型方法的每个参数的类型

  17. 17

    如何从包含泛型参数的Type中获取“基本”类型?

  18. 18

    如何在方法参数中使用泛型类型投影?

  19. 19

    如何在Kotlin中获取经过修饰的泛型参数的实际类型参数?

  20. 20

    从泛型类型类确定方法参数类型

  21. 21

    如何提取泛型类型参数的数据类型?

  22. 22

    参数类型模板类型中的泛型 lambda auto

  23. 23

    以匿名类型作为泛型参数的泛型类型实例,如何正确转换回原始类型?

  24. 24

    泛型方法从超类获取参数类型

  25. 25

    如何在JAVA泛型中定义使用2个泛型参数扩展Map对象的类型?

  26. 26

    调用泛型方法时如何推断参数类型?

  27. 27

    无法匹配方法参数中的泛型类型

  28. 28

    泛型-类型中的方法不适用于参数

  29. 29

    泛型类型参数C#-如何泛型类返回类型

热门标签

归档