将泛型类型转换为另一种泛型类型扩展方法

时间:2011-04-20 09:21:46

标签: generics methods types

我正在做一些非法的事情,因为编译器抱怨但我不知道应该做什么。基本上我想将一种类型的列表转换为另一种类型的列表。任何帮助非常感谢。这是我的扩展方法:

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;
    }

1 个答案:

答案 0 :(得分: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();