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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:20:23