尝试在下面做,但显然对反射知之甚少。
我正在尝试做的例子是,我想将一个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);
}
答案 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>();