You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP技术问题:如何获取程序集中所有页面对象及对应类型字符串名称

嘿,我之前正好做过类似的需求,UWP里的实现思路和WPF有共通之处,但因为UWP的反射机制和WPF略有差异,得做些针对性调整。下面给你详细讲讲具体的实现方案:

UWP中获取当前程序集所有页面对象及类型名称的方案

核心实现思路

通过反射遍历当前应用程序集的所有类型,筛选出**继承自Page**的有效类型(排除抽象类、泛型定义这些无法实例化的类型),然后按需实例化页面对象并记录对应的类型名称;如果只需要类型信息,也可以跳过实例化步骤直接收集名称。

完整代码示例(包含实例化页面对象)

首先确保引用必要的命名空间:

using System;
using System.Collections.Generic;
using System.Reflection;
using Windows.UI.Xaml.Controls;
using System.Diagnostics;

然后实现获取方法:

public List<(Page PageInstance, string TypeFullName)> GetAllPagesWithInstances()
{
    var pageCollection = new List<(Page, string)>();
    
    // 获取当前应用的程序集(这里以App类所在的程序集为例,替换成你自己的命名空间)
    var currentAssembly = typeof(YourAppNamespace.App).GetTypeInfo().Assembly;

    // 遍历程序集中所有已定义的类型
    foreach (var typeInfo in currentAssembly.DefinedTypes)
    {
        // 筛选条件:是Page的子类、非抽象类、非泛型定义类型
        if (typeInfo.IsSubclassOf(typeof(Page)) && !typeInfo.IsAbstract && !typeInfo.IsGenericTypeDefinition)
        {
            try
            {
                // 实例化页面对象(如果你的Page有带参数的构造函数,这里会抛出异常,需要特殊处理)
                var pageInstance = Activator.CreateInstance(typeInfo.AsType()) as Page;
                if (pageInstance != null)
                {
                    // 获取类型的完整名称(比如"YourAppNamespace.Page1"),如果只需要类名用typeInfo.Name即可
                    var typeFullName = typeInfo.FullName;
                    pageCollection.Add((pageInstance, typeFullName));
                }
            }
            catch (Exception ex)
            {
                // 捕获实例化异常,比如带参数构造函数的情况
                Debug.WriteLine($"无法实例化页面 {typeInfo.Name}: {ex.Message}");
            }
        }
    }

    return pageCollection;
}

简化版本(仅获取类型名称)

如果不需要实际的页面对象,只需要收集所有页面的类型名称,可以简化代码,避免实例化带来的开销和异常:

public List<string> GetAllPageTypeNames()
{
    var typeNames = new List<string>();
    var currentAssembly = typeof(YourAppNamespace.App).GetTypeInfo().Assembly;

    foreach (var typeInfo in currentAssembly.DefinedTypes)
    {
        if (typeInfo.IsSubclassOf(typeof(Page)) && !typeInfo.IsAbstract && !typeInfo.IsGenericTypeDefinition)
        {
            // 可以选择添加FullName或Name,按需使用
            typeNames.Add(typeInfo.FullName);
            // typeNames.Add(typeInfo.Name); // 只取类名,比如"Page1"
        }
    }

    return typeNames;
}

关键注意事项

  1. 程序集获取方式:UWP中不能直接使用WPF里的Assembly.GetExecutingAssembly(),需要通过应用内的某个具体类型(比如App类)的GetTypeInfo().Assembly来获取当前程序集,这是因为UWP基于WinRT的反射模型,API和传统.NET有所不同。
  2. 实例化异常处理:如果你的页面有自定义的带参数构造函数,Activator.CreateInstance会失败。这种情况下,你需要根据页面的构造函数参数手动处理实例化逻辑,或者如果使用了依赖注入框架(比如Microsoft.Extensions.DependencyInjection),可以从容器中获取页面实例。
  3. 筛选条件:一定要排除抽象类和泛型类型定义,否则会收集到无效的、无法实例化的类型。

内容的提问来源于stack exchange,提问作者Bimo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:11:44