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

C# 在metro中,是否获取(抽象)类的所有继承类?,c#,microsoft-metro,windows-runtime,C#,Microsoft Metro,Windows Runtime,我在metro中尝试获取所有继承类时遇到了问题。WinRT API与.net framework不同,因此解决方案(和)都不起作用 欢迎使用任何代码或工具解决方案 我还在努力。如果成功,我会将我的解决方案放在这里。这应该有效(基于以下代码): public IEnumerable GetEnumerableOfType(params object[]constructorArgs),其中T:class,IComparable { 列表对象=新列表(); foreach(类型为typeof(T).

我在metro中尝试获取所有继承类时遇到了问题。WinRT API与.net framework不同,因此解决方案(和)都不起作用

欢迎使用任何代码或工具解决方案

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

这应该有效(基于以下代码):

public IEnumerable GetEnumerableOfType(params object[]constructorArgs),其中T:class,IComparable
{
列表对象=新列表();
foreach(类型为typeof(T).GetTypeInfo().Assembly.ExportedTypes中的类型
.Where(myType=>myType.GetTypeInfo().IsClass&&
!myType.GetTypeInfo().IsaStract&&
myType.GetTypeInfo().IsubClassOf(typeof(T)))
{
Add((T)Activator.CreateInstance(type,constructorArgs));
}
objects.Sort();
归还物品;
}
基本上,
TypeInfo
现在是执行任何反射操作的主类,您可以通过调用
Type
上的
GetTypeInfo()
来获得它(基于以下代码):

public IEnumerable GetEnumerableOfType(params object[]constructorArgs),其中T:class,IComparable
{
列表对象=新列表();
foreach(类型为typeof(T).GetTypeInfo().Assembly.ExportedTypes中的类型
.Where(myType=>myType.GetTypeInfo().IsClass&&
!myType.GetTypeInfo().IsaStract&&
myType.GetTypeInfo().IsubClassOf(typeof(T)))
{
Add((T)Activator.CreateInstance(type,constructorArgs));
}
objects.Sort();
归还物品;
}
基本上,
TypeInfo
现在是执行任何反射操作的主类,您可以通过调用
Type
上的
GetTypeInfo()
来获得它。 您的解决方案很好,尽管只需要很少的修改

我观察到的一件事是,您的静态方法不能放入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;
    }
//GetTypeInfo()返回来自命名空间的TypeInfo
运用系统反思;
公共列表GetEnumerableOfType(参数对象[]构造函数args),其中T:class
{
列表对象=新列表();
IEnumerable s=typeof(T).GetTypeInfo().Assembly.ExportedTypes.Where(myType=>myType.GetTypeInfo().IsClass&&
!myType.GetTypeInfo().IsaStract&&
myType.GetTypeInfo().IsSubclassOf(typeof(T));
foreach(键入s)
对象。添加(类型);
归还物品;
}
下面是一个测试样本

     var list = GetEnumerableOfType<UIElement>();

     foreach (var v in list)
         Debug.WriteLine(v.Name);
var list=GetEnumerableOfType();
foreach(列表中的var v)
Debug.WriteLine(v.Name);
谢谢你,达米尔·阿赫。
您的解决方案很好,尽管只需要很少的修改

我观察到的一件事是,您的静态方法不能放入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;
    }
//GetTypeInfo()返回来自命名空间的TypeInfo
运用系统反思;
公共列表GetEnumerableOfType(参数对象[]构造函数args),其中T:class
{
列表对象=新列表();
IEnumerable s=typeof(T).GetTypeInfo().Assembly.ExportedTypes.Where(myType=>myType.GetTypeInfo().IsClass&&
!myType.GetTypeInfo().IsaStract&&
myType.GetTypeInfo().IsSubclassOf(typeof(T));
foreach(键入s)
对象。添加(类型);
归还物品;
}
下面是一个测试样本

     var list = GetEnumerableOfType<UIElement>();

     foreach (var v in list)
         Debug.WriteLine(v.Name);
var list=GetEnumerableOfType();
foreach(列表中的var v)
Debug.WriteLine(v.Name);