可以将类型的通用列表转换为其超类型的通用列表吗?

时间:2010-11-17 20:37:06

标签: c# .net reflection generics

尝试在下面做,但显然对反射知之甚少。

我正在尝试做的例子是,我想将一个JazzDancer列表“解析”为一个Dancer列表(所有舞者类型都继承自)。想要确保如果DanceStyle在这里是Jazz,那么只有JazzDancer类型会出现在舞者列表中。希望这是有道理的。

问题是您似乎无法将List转换为List。

这甚至可能吗?

List<Dancer> dancers = TypeNameResolver<Dancer>.ResolveList(DanceStyle, typeof(Dancer));


public static List<T> ResolveList(IDanceStyle style, Type toType)
        {
            Type list = typeof (List<>);
            Type[] pars = { TypeNameResolver<T>.Resolve(style,toType).GetType()};
            List<T> result = (List<T>)Activator.CreateInstance(list.MakeGenericType(pars));
            return result;
        }

public static T Resolve(IDanceStyle style, Type toType)
{
    Assembly a = Assembly.GetExecutingAssembly();
    var typeName = style.GetType().Name + toType.Name;
    var toTypeNameSpace = toType.Namespace;
    return (T)a.CreateInstance(toTypeNameSpace + "." + typeName);
}

2 个答案:

答案 0 :(得分:3)

你不需要反思。另一方面,LINQ可以在这里提供帮助:

List<JazzDancer> myListOfJazzDancers = ...;
List<Dancer> myListOfDancers = myListOfJazzDancers.Cast<Dancer>().ToList()

答案 1 :(得分:1)

您可以使用Linq查询执行此操作:

dancers = jazzDancers.Cast<Dancer>();

如果您需要对每个jazzDancer进行某种检查,只需添加Where,例如:

dancers = jazzDancers.Where(jd => jd.SomeFiels == Something).Cast<Dancer>();