在没有通用函数调用的情况下扩展可枚举

时间:2018-02-23 18:21:29

标签: c# generics ienumerable

试图弄清楚为什么我不能这样做......

我有这个简单的界面" IMapper"用于将一个对象更改为另一个对象:

public interface IMapper<T>
{
    T Map();
}

你只需这样称呼:

var newObject = oldObject.Map();

然后我决定扩展IEnumerable以便我可以在整个枚举中执行此操作。所以我创建了这个函数:

public static class EnumerableMapperExtension
{
    public static IEnumerable<TTo> Map(this IEnumerable<TFrom> enumerable) where TFrom : IMapper<TTo>
    {
        return enumerable.Select(x => x.Map());
    }
}

除了上面的语法错误。它看起来像这样:

public static class EnumerableMapperExtension
{
    public static IEnumerable<TTo> Map<TTo, TFrom>(this IEnumerable<TFrom> enumerable) where TFrom : IMapper<TTo>
    {
        return enumerable.Select(x => x.Map());
    }
}

所以不要看这个漂亮的电话......

IEnumerable<NewType> newArray = oldArray.Map();

我必须这样称呼它:

IEnumerable<NewType> newArray = oldArray.Map<NewType, Oldtype>();

有没有理由编译器无法弄清楚枚举存储的类型?

(为清晰起见而编辑)

1 个答案:

答案 0 :(得分:-1)

var newArray会给方法带来负担,以确定它是什么类型。当你按照你所做的方式调用泛型方法时,你需要给调用者带来负担以提供类型。

可能有用:

IEnumerable<NewType> gg = oldArray.Map();

但我对仿制药的经验是,如果我能使它工作,那么这样的小麻烦就是零件和包裹