WPF中如何使用作为命令参数接收的Object类实例
解决运行时从Object类型对象获取设备数据的方法
因为Dev是object类型,编译期无法识别它的实际属性,所以需要通过类型转换、动态类型或反射来访问其携带的设备数据,以下是几种常用方案:
1. 强类型转换(推荐,类型安全)
如果明确Dev的实际类型(比如名为DeviceInfo),直接做类型转换:
public void SelectTestCase(object Dev) { try { // 转换为实际设备类型,空值判断避免类型不匹配报错 var device = Dev as DeviceInfo; if (device != null) { string deviceName = device.DeviceName; _navigationStore.CurrentViewModel = new TestCaseViewModel(_navigationStore, deviceName); } } catch (Exception e) { // 建议添加异常日志,方便后续排查问题 } }
也可以用is关键字先做类型判断再转换:
if (Dev is DeviceInfo device) { string deviceName = device.DeviceName; // 后续业务逻辑 }
2. 使用动态类型(dynamic)
若不想做强类型转换,可通过dynamic绕过编译期类型检查,直接访问属性:
public void SelectTestCase(object Dev) { try { dynamic device = Dev; string deviceName = device.DeviceName; _navigationStore.CurrentViewModel = new TestCaseViewModel(_navigationStore, deviceName); } catch (RuntimeBinderException e) { // 处理属性不存在的运行时异常 } catch (Exception e) { // 其他异常处理 } }
注意:这种方式没有编译期校验,如果Dev实际类型不含DeviceName属性,会在运行时抛出异常,需针对性捕获。
3. 反射(适合未知类型场景)
如果完全不清楚Dev的实际类型,可通过反射获取属性值:
public void SelectTestCase(object Dev) { try { // 获取DeviceName属性 var deviceNameProperty = Dev.GetType().GetProperty("DeviceName"); if (deviceNameProperty != null) { string deviceName = deviceNameProperty.GetValue(Dev) as string; _navigationStore.CurrentViewModel = new TestCaseViewModel(_navigationStore, deviceName); } } catch (Exception e) { // 异常处理 } }
反射性能相对较低,非必要场景优先选择前两种方案。
内容的提问来源于stack exchange,提问作者abhay singh
相关产品推荐
相关产品推荐

