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

