试图在 Metro 中获取所有继承的类时,我被卡住了。WinRT API 与 .net 框架不同,因此两种解决方案(解决方案1和解决方案2 )都不起作用。
任何代码或工具解决方案都值得赞赏。
我还在努力。如果成功,我会将我的解决方案放在这里。
这应该有效(基于此处的代码):
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
谢谢达米尔·阿。您的解决方案很棒,尽管它只需要很少的修改。
我观察到的一件事是您的静态方法不能放入 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);