【问题标题】:Convert generic type to another generic type extension method将泛型类型转换为另一个泛型类型扩展方法
【发布时间】:2011-08-09 08:15:54
【问题描述】:
当编译器抱怨时,我在这里做了一些非法的事情,但我不知道应该怎么做。基本上我想将一种类型的列表转换为另一种类型的列表。非常感谢任何帮助。这是我的扩展方法:
public static List<TTypeConvertTo> ConvertFromEntityContext<TTypeConvertFrom>(this List<TTypeConvertFrom> source)
where TTypeConvertTo : BaseModel
{
List<TTypeConvertTo> result = null;
if (source != null)
{
result = new List<TTypeConvertTo>();
foreach (var item in source)
{
result.Add(item.ConvertFromEntityContext());
}
}
return result;
}
【问题讨论】:
标签:
generics
methods
types
【解决方案1】:
如果方法是泛型的,它应该包括所有泛型类型,包括TTypeConvertTo。你可能不需要TTypeConvertFrom 作为泛型类型,所以试试:
public static List<TTypeConvertTo> ConvertFromEntityContext<TTypeConvertTo>
(this List<FromBaseModel> source)
如果您需要这两种类型都是通用的(这似乎没有必要),您还必须将TTypeConvertFrom 限制为具有ConvertFromEntityContext 方法的基本类型:
public static List<TTypeConvertTo> ConvertFromEntityContext<TTypeConvertFrom, TTypeConvertTo>
(this List<TTypeConvertFrom > source)
where TTypeConvertTo : BaseModel, TTypeConvertFrom : FromBaseModel
这不太可取,因为它会使调用过于冗长:编译器无法推断返回类型,因此每次调用该方法时都必须指定这两种类型。
无论哪种方式,您都可以使用 LINQ 重写您的方法主体:
if (source == null)
return null;
return source.Select(item => item.ConvertFromEntityContext()).ToList();