2012-11-14 80 views

回答

1

這應該工作(基於here代碼):

public IEnumerable<T> GetEnumerableOfType<T>(params object[] constructorArgs) where T : class, IComparable<T> 
{ 
    List<T> objects = new List<T>(); 
    foreach (Type type in typeof(T).GetTypeInfo().Assembly.ExportedTypes 
            .Where(myType => myType.GetTypeInfo().IsClass && 
                !myType.GetTypeInfo().IsAbstract && 
                myType.GetTypeInfo().IsSubclassOf(typeof(T)))) 
    { 
     objects.Add((T)Activator.CreateInstance(type, constructorArgs)); 
    } 
    objects.Sort(); 
    return objects; 
} 

基本上TypeInfo現在是做任何反射操作的主類,你可以通過在Type調用GetTypeInfo()得到它。

0

謝謝Damir Arh。 您的解決方案雖然只需很少修改,但效果很好。

我觀察到的一件事是您的靜態方法無法放入MainPage類,否則會發生編譯錯誤。可能是因爲初始化xaml與它衝突。另一方面,我將原始代碼更改爲更簡單有用的代碼,運行時錯誤更少(在很多情況下,objects.Add((T)Activator.CreateInstance(type, constructorArgs));中的行通常會導致運行時錯誤)。主要目的是爲了獲得所有的繼承類。

// GetTypeInfo() returns TypeInfo which comes from the namespace 
    using System.Reflection; 

    public List<Type> GetEnumerableOfType<T>(params object[] constructorArgs) where T : class 
    { 
     List<Type> objects = new List<Type>(); 

     IEnumerable<Type> s = typeof(T).GetTypeInfo().Assembly.ExportedTypes.Where(myType => myType.GetTypeInfo().IsClass && 
                 !myType.GetTypeInfo().IsAbstract && 
                 myType.GetTypeInfo().IsSubclassOf(typeof(T))); 

     foreach (Type type in s) 
      objects.Add(type); 

     return objects; 
    } 

而下面是一個測試樣本。

 var list = GetEnumerableOfType<UIElement>(); 

    foreach (var v in list) 
     Debug.WriteLine(v.Name);