在metro中,获取(抽象)类的所有继承类?

时间:2012-11-14 04:22:44

标签: c# microsoft-metro windows-runtime

我试图在Metro中获取所有继承的类时遇到困难。 WinRT API与.net框架不同,因此解决方案(solution1solution2)都不起作用。

感谢任何代码或工具解决方案。

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

2 个答案:

答案 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);