关于泛型集合类List的扩展方法问题

.Net技术 码拜 9年前 (2016-05-15) 801次浏览
本人想实现泛型集合自带的方法list.Cast<T>()同样的效果:把list转换为List<T>
List<T>自带的Cast使用示例:
List<Dog> listDog = new List<Dog>();
List<GodenHairDog> listGoldenHairDog = listDog.Cast<GodenHairDog>().ToList();//把Dog类型的集合转换成 GodenHairDog类型的集合。其中GodenHairDog继承自Dog类
本人本人写的相似功能的扩展MyCast  使用示例:
List<GodenHairDog> list = listDog.MyCast<Dog,GodenHairDog>().ToList();
问题:本人怎么修改本人的源代码,才能像List<T>自带的方法Cast<T>()只传入一个类型占位符T??????
本人本人写的要传入两个类型占位符才得行
   下面是本人写的扩展方法代码

public static  class ListExtension
    {
     public static List<Tout> MyCast<T,Tout>(this List<T> list)
         where Tout : T
     {
         List<Tout> newList = new List<Tout>();
         for (int i = 0; i < list.Count; i++)
         {
             Tout item = (Tout)list[i];
             newList.Add(item);
         }
         
         return newList;
     }
    }
}
解决方案

10

查下协变、逆变吧,你这种没必要扩展
而且你真要实现这种的话,直接用automapper之类的dll就行了

10

List<GodenHairDog> listGoldenHairDog = listDog.Select(x=>(GodenHairDog)x).ToList();

80

Cast<> 并不是List<T>的功能,而是Linq的功能。
你可以相似这样来声明泛型参数签名:

public static IEnumerable<Tout> MyCast<Tout>(this IList list)
{
    foreach(var x in list)
    {
        yield return (Tout)x;
    }
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于泛型集合类List的扩展方法问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)