本人想实现泛型集合自带的方法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??????
本人本人写的要传入两个类型占位符才得行
下面是本人写的扩展方法代码
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就行了
而且你真要实现这种的话,直接用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; } }