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

C#中如何访问字典中作为值的对象的属性与方法?

C# 中访问字典内 Pet 对象的属性与方法

核心问题

你定义的字典类型是Dictionary<string, Object>,值的类型被统一为Object,导致无法直接调用Pet类的属性和方法,必须先完成类型转换。

具体解决方案

1. 调用 Pet 的 printPet 方法

遍历字典时,先将值安全转换为Pet类型,再调用方法:

foreach (var entry in ourAnimals)
{
    // 安全类型检查+转换,避免类型不匹配报错
    if (entry.Value is Pet pet)
    {
        Console.WriteLine($"键: {entry.Key}");
        pet.printPet();
        Console.WriteLine("---"); // 分隔不同宠物信息
    }
}

如果确定字典内所有值都是Pet对象,也可以用强制转换(风险较高,类型错误会抛出异常):

((Pet)entry.Value).printPet();

2. 格式化打印键值对(访问属性)

同样先转换类型,再逐个访问属性输出:

foreach (var entry in ourAnimals)
{
    if (entry.Value is Pet pet)
    {
        Console.WriteLine($"=== 宠物 {entry.Key} 详情 ===");
        Console.WriteLine($"昵称: {pet.nickname}");
        Console.WriteLine($"品种: {pet.species}");
        Console.WriteLine($"年龄: {pet.age}");
        Console.WriteLine($"外形描述: {pet.physicalDescription}");
        Console.WriteLine($"性格描述: {pet.personalityDescription}");
        Console.WriteLine($"建议捐赠额: {pet.suggestedDonation}");
        Console.WriteLine();
    }
}

优化方案

如果字典只会存储Pet对象,建议直接将字典类型改为Dictionary<string, Pet>,省去每次类型转换的步骤:

Dictionary<string, Pet> ourAnimals = new();

之后可以直接访问属性或调用方法:

ourAnimals["d1"].printPet();
Console.WriteLine(ourAnimals["d1"].nickname);

PowerShell 中类似问题的解决方法

假设你在PowerShell中创建了存储自定义Pet对象的字典,分两种场景处理:

场景1:用PSCustomObject模拟Pet对象

# 创建Pet对象
$pet1 = [PSCustomObject]@{
    species = "橘猫"
    age = "2岁"
    physicalDescription = "短毛橘色"
    personalityDescription = "粘人爱撒娇"
    nickname = "橘子"
    suggestedDonation = "50元"
}

# 创建字典
$ourAnimals = @{
    "d1" = $pet1
}

遍历访问属性并格式化输出:

foreach ($entry in $ourAnimals.GetEnumerator()) {
    Write-Host "=== 宠物 $($entry.Key) 信息 ==="
    Write-Host "昵称: $($entry.Value.nickname)"
    Write-Host "品种: $($entry.Value.species)"
    Write-Host "年龄: $($entry.Value.age)"
    Write-Host "外形描述: $($entry.Value.physicalDescription)"
    Write-Host "性格描述: $($entry.Value.personalityDescription)"
    Write-Host "建议捐赠额: $($entry.Value.suggestedDonation)"
    Write-Host ""
}

场景2:用类定义Pet对象

class Pet {
    [string]$species
    [string]$age
    [string]$physicalDescription
    [string]$personalityDescription
    [string]$nickname
    [string]$suggestedDonation

    Pet([string]$Species, [string]$Age, [string]$PhysicalDescription, [string]$PersonalityDescription, [string]$Nickname, [string]$SuggestedDonation) {
        $this.species = $Species
        $this.age = $Age
        $this.physicalDescription = $PhysicalDescription
        $this.personalityDescription = $PersonalityDescription
        $this.nickname = $Nickname
        $this.suggestedDonation = $SuggestedDonation
    }

    [void]printPet() {
        Write-Host $this.nickname
        Write-Host $this.species
        Write-Host $this.age
        Write-Host $this.physicalDescription
        Write-Host $this.personalityDescription
        Write-Host $this.suggestedDonation
    }
}

# 创建字典
$ourAnimals = @{
    "d1" = [Pet]::new("橘猫", "2岁", "短毛橘色", "粘人爱撒娇", "橘子", "50元")
}

遍历调用printPet方法:

foreach ($entry in $ourAnimals.GetEnumerator()) {
    Write-Host "键: $($entry.Key)"
    $entry.Value.printPet()
    Write-Host "---"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:02:38