gpt4 book ai didi

c# - 编写具有多种类型的泛型扩展方法时的类型推断问题

转载 作者:太空狗 更新时间:2023-10-29 22:28:33 26 4
gpt4 key购买 nike

我正在为 IEnumerable 编写一个通用扩展方法,用于将一个对象列表映射到另一个映射对象列表。这就是我希望该方法的工作方式:

IList<Article> articles = GetArticles();
return articles.Map<ArticleViewModel>(_mappingEngine);

这是方法:

public static IEnumerable<T2> Map<T1, T2>(this IEnumerable<T1> list, IMappingEngine engine)
{
return list.Select(engine.Map<T1, T2>);
}

但是articles.Map<ArticleViewModel>(_mappingEngine);给出编译错误。问题是 T1 的类型推断不起作用。我必须明确地这样调用它:

articles.Map<Article, ArticleViewModel>(_mappingEngine);

如果我创建一个只有一个参数 T1 的扩展方法,如下所示:

public static IEnumerable<T1> DummyMap<T1>(this IEnumerable<T1> list, IMappingEngine engine)
{
return list;
}

然后我可以这样调用它,而不必指定 T1:

articles.DummyMap(_mappingEngine);

为什么编译器无法在Map的扩展方法中推断出T1的类型?

最佳答案

The problem is that the type inference for T1 doesn't work

实际上,问题不在于 T1,而是 T2;此推理中不使用返回类型。所以你不能那样做。一种选择可能是流畅的 API,例如:

return articles.Map(_mappingEngine).To<SomeT2>();

用类似的东西:

public static MapProjection<T1> Map<T1>(this IEnumerable<T1> list, IMappingEngine engine)
{
return new MapProjection<T1>(list, engine);
}
public class MapProjection<T1>
{
private readonly IEnumerable<T1> list;
private readonly IMappingEngine engine;
internal MapProjection( IEnumerable<T1> list, IMappingEngine engine)
{this.list = list; this.engine = engine;}

public IEnumerable<T2> To<T2>()
{
return list.Select(engine.Map<T1, T2>());
}
}

假设界面是这样的:

public interface IMappingEngine {
Func<T1, T2> Map<T1, T2>();
}

关于c# - 编写具有多种类型的泛型扩展方法时的类型推断问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5243357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com