【问题标题】:C# - Get value from dictionary with key - return property of object?C# - 使用键从字典中获取值 - 返回对象的属性?
【发布时间】:2025-12-18 13:00:02
【问题描述】:

我正在制作一个程序,当输入一个元素的化学符号时,它会将该元素的信息返回到表单上。这很简单,但它想尝试让我的代码尽可能高效。

我的字典:

Dictionary<string, object> alkaliM = new Dictionary<string, object>();

也在我的代码中:

alkaliM.Add("Li", new AlkaliMetals.Lithium());

elementSymbol 是我从文本框中输入的字符串

我正在尝试将elementName.Text 设置为我的AlkaliMetals.Lithium 对象的属性“name”。但是,我不能简单地说:

elementName.Text = alkaliM[elementSymbol.Text]; 因为我无法将对象设置为字符串。 ("Cannot implicty convert type "object" to "string"")

有没有办法只使用密钥将elementName.Text 设置为AlkaliMetals.Lithium.name

我有一个单独的文件,其中有一个主类 AlkaliMetals 和每个碱金属的子类,如 Lithium

如果我的描述没有意义,请告诉我,我会尽力解释我的意思。

【问题讨论】:

  • elementName.Text = alkaliM[elementSymbol.Text].name ?
  • @EhsanSajjad 不起作用,因为字典被定义为 &lt;string, object&gt;。它需要一个演员表。
  • 不要使用object 作为引用类型,而是使用每个元素派生自的基类。并访问您的姓名:alkaliM[elementSymbol.Text].name simple
  • 为什么首先将System.Object 存储为Value?我想有一个通用的基本类型或接口都实现了。
  • @stuartd 啊对,我错过了它是object:/

标签: c# object dictionary casting key


【解决方案1】:

你可以让AlkaliMetals.cs中的所有子类都实现一个抽象类CommonAbstractClass 拥有属性name

定义你的字典为Dictionary&lt;string, CommonAbstractClass&gt;

然后使用你的字典如下elementName.Text = alkaliM[elementSymbol.Text].name;

【讨论】:

    【解决方案2】:

    您可以使用动态转换找到name 属性(如果您绝对确定它存在):

    elementName.Text = (alkaliM[elementSymbol.Text] as dynamic).name
    

    但是,更有效的方法是Object Oriented Design

    定义一个名为ChemicalElement的类,添加name属性,然后从ChemicalElement派生Lithium。这样你就可以写了:

    elementName.Text = (alkaliM[elementSymbol.Text] as ChemicalElement).name
    

    最好的解决办法是这样定义你的字典:

    Dictionary<string, ChemicalElement> alkaliM = new Dictionary<string, ChemicalElement>();
    

    然后访问namelike:

    elementName.Text = alkaliM[elementSymbol.Text].name
    

    【讨论】:

    • 此解决方案有效。向@MarkBenovsky 快速提问,我将如何合并“基本抽象类”。总的来说,我对类和对象有点陌生,想提高我在这些领域的能力。
    最近更新 更多