當我試圖獲得城市中所有的繼承類時,我陷入了困境。 WinRT API與.net框架不同,因此這兩種解決方案(solution1和solution2)都不起作用。在metro中,獲取(抽象)類的所有繼承類?
任何代碼或工具解決方案表示讚賞。
我還在嘗試。如果成功,我會在這裏解決我的問題。
當我試圖獲得城市中所有的繼承類時,我陷入了困境。 WinRT API與.net框架不同,因此這兩種解決方案(solution1和solution2)都不起作用。在metro中,獲取(抽象)類的所有繼承類?
任何代碼或工具解決方案表示讚賞。
我還在嘗試。如果成功,我會在這裏解決我的問題。
這應該工作(基於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()
得到它。
謝謝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);