我试图在Metro中获取所有继承的类时遇到困难。 WinRT API与.net框架不同,因此解决方案(solution1和solution2)都不起作用。
感谢任何代码或工具解决方案。
我还在努力。如果成功,我会把解决方案放在这里。
答案 0 :(得分: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
现在是进行任何反思操作的主要类,您可以通过调用GetTypeInfo()
上的Type
来获取它。
答案 1 :(得分: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);