1

试图在 Metro 中获取所有继承的类时,我被卡住了。WinRT API 与 .net 框架不同,因此两种解决方案(解决方案1和解决方案2 )都不起作用。

任何代码或工具解决方案都值得赞赏。

我还在努力。如果成功,我会将我的解决方案放在这里。

4

2 回答 2

1

这应该有效(基于此处的代码):

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

于 2012-11-14T06:01:45.773 回答
0

谢谢达米尔·阿。您的解决方案很棒,尽管它只需要很少的修改。

我观察到的一件事是您的静态方法不能放入 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);
于 2012-11-14T08:44:54.373 回答