代码之家  ›  专栏  ›  技术社区  ›  andryuha

是否可以将类型的泛型列表强制转换为其超级类型的泛型列表?

  •  1
  • andryuha  · 技术社区  · 14 年前

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

    我尝试做的例子是,我想“解析”一个爵士舞者列表到一个舞者列表中(所有舞者类型都从中继承)。想确保如果这里的舞蹈风格是爵士乐,只有爵士舞者类型将在舞者名单中。希望这有道理。

    问题是,您似乎无法将列表强制转换为列表。

    这是可能的吗?

    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 回复  |  直到 14 年前
        1
  •  3
  •   Heinzi    14 年前

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

    List<JazzDancer> myListOfJazzDancers = ...;
    List<Dancer> myListOfDancers = myListOfJazzDancers.Cast<Dancer>().ToList()
    
        2
  •  1
  •   Klaus Byskov Pedersen    14 年前

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

    dancers = jazzDancers.Cast<Dancer>();
    

    如果你需要对每一个爵士舞者做一些检查,你只需要增加一个 Where 例如:

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