用反射通过字符串获取窗体


通过反射获取窗体:
string _fromName = "ReportDemo.ReportForm.TableForm"; //子窗体的全路径名称
Type type = Type.GetType(_fromName, true, true);//加上命名空间 
var temp = Activator.CreateInstance(type); 
BaseForm baseForm = temp as BaseForm;  //基窗体,TableForm继承了BaseForm。

//Type GetType(string typeName, bool throwOnError, bool ignoreCase):获取具有指定名称的 System.Type,指定是否执行区分大小写的搜索,以及在找不到类型时是否引发异常。 
//Activator:包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。 此类不能被继承。 
//object CreateInstance(Type type):使用指定类型的默认构造函数来创建该类型的实例。 
// 参数:  
//   type: 
//     要创建的对象的类型。 
// 
// 返回结果:  
//     对新创建对象的引用。 
### 如何在 WPF 应用程序中使用反射操作窗体 在 WPF 中利用反射可以实现动态加载窗体,这使得应用程序更加灵活和模块化。当按钮被点击时,可以通过 `Tag` 属性指定要导航至的目标页面名称,并借助于反射机制实例化相应的页面对象。 对于给定的例子,在代码片段中展示了如何通过获取发送者的标签属性来决定创建哪个类型的页面实例: ```csharp private void Button_Click(object sender, RoutedEventArgs e) { Button sb = sender as Button; Type type = Type.GetType("WpfApp1." + sb.Tag.ToString()); // 通过项目路径后台type对象 if (type != null) { object obj = Activator.CreateInstance(type); // 创建目标页面的对象 NavigationService.Navigate(obj); // 导航到新创建的页面 } } ``` 上述方法适用于基于框架页 (`Frame`) 和导航服务 (`NavigationService`) 构建的应用场景[^2]。为了使此功能正常工作,确保所涉及的类名(即页面)位于正确的命名空间下,并且这些页面继承自 `Page` 类或者实现了可作为导航目的地所需的接口。 另外值得注意的是,虽然这里展示的方法能够满足基本需求,但在实际应用开发过程中建议采用更稳健的设计模式如 MVVM 或依赖注入等技术来增强系统的可维护性和扩展性[^3]。 #### 关键点总结 - 利用了 C# 的反射特性,允许运行期间根据字符串形式的全限定类名创建对象。 - 使用了 `Activator.CreateInstance()` 方法代替原始示例中的 `.Assembly.CreateInstance()`, 这样可以使代码更为简洁易读。 - 需要注意的是,这种方式要求所有可能被反射调用的页面都应当存在于已知的程序集范围内,并遵循特定的命名约定以便能正确解析类型名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值