2010-11-17 39 views
1

試圖在下面做,但對反射顯然不夠了解。可能將通用類型列表轉換爲其超類型的通用列表?

我想要做的事情的例子是,我想將「JazzDancer」列表「解析」爲舞者(所有舞者類型從中繼承)的列表。想要確保如果這裏的DanceStyle是Jazz,那麼只有JazzDancer類型會出現在舞者列表中。希望這是有道理的。

問題是您似乎無法將列表轉換爲列表。

這可能嗎?

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); 
} 

回答

3

您不需要爲此進行反思。 LINQ,在另一方面,可以幫助在這裏:

dancers = jazzDancers.Cast<Dancer>(); 

如果你需要做一些每個jazzDancer檢查的,你只需要添加:

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

謝謝你,它的工作原理。那麼我意識到我無法真正將JazzDancers列表轉換爲舞者列表,並且仍然可以將其列爲JazzDancers,當可以通過使用列表 .Add方法並在那裏添加實際的JazzDancers實例時。 – andryuha 2010-11-18 03:12:07

+0

@andryuha:好吧,如果您確定列表中只包含JazzDancers,那麼您可以在將它們轉換爲JazzDancers後將其轉換爲JazzDancers。另一方面,如果你確定它只包含JazzDancers,那麼你最好使用'List '...... – Heinzi 2010-11-18 15:02:34

1

你可以用LINQ查詢做一個Where如:

dancers = jazzDancers.Where(jd => jd.SomeFiels == Something).Cast<Dancer>(); 
相關問題