Dictionary <string,object>不允许我访问Object成员</string,object>

时间:2011-01-17 02:10:50

标签: c#

考虑到:

Dictionary<string,Object> dict = new Dictionary<string,Object>();

dict.Add("Name","deadlock");
dict.Add("Birthday",new BD(12,12,1955));

知道BD是:

public class BD {

public int Day {get; set; }
public int Month {get; set; }
public int Year {get; set;}

public BD(int x,int y,int z) { Day=x; Month=y; Year=z; }
}

我的问题是我无法从字典中引用日,月,年:

int Day1 = dict["Birthday"].Day;

以上代码无效。欢迎任何建议。

4 个答案:

答案 0 :(得分:4)

int Day1 = ((BD)dict["Birthday"]).Day;

您需要将其投射到BD对象中。

答案 1 :(得分:1)

您需要将对象强制转换为您要使用的类型:

int Day1 = ((BD) dict["Birthday"]).Day;

答案 2 :(得分:1)

它不起作用,因为dict["Birthday"]返回类型为Object的对象

为了按预期使用它,您需要将对象强制转换为适当的类型。

if(dict["Birthday"] is BD)
{
  var bd = dict["Birthday"];
  bd.Day; //do something useful
}

//or
var bd = dict["Birthday"] as BD
if(bd != null)
{
  bd.Day; //something useful
}

然而,你正在做的是一个kludge。存储同类型时,集合最有效。通过存储通用对象,您当然可以存储混合类型,但是您还需要在投射之前确保类型安全。

答案 3 :(得分:1)

尽管变量或引用上始终存在多种数据类型,但实例成员仅通过一种数据类型(以及它继承的内容)进行过滤。因此,一次声明(声明)数据类型。然后编译器知道它在该点处理的多个数据类型。

在您的情况下,任何BD的实例都是所有类型:BDSystem.Object通过继承。如果已经实现了任何接口,那么这些接口也将是实例的其他数据类型。

但是类型Object仅显示Object成员(以及它继承的内容,仅此而已),即使数据类型BD也是其中的一部分。

要向C#编译器显式声明您使用多个可用数据类型的意图,您将不得不使用C#/ .NET中的一种机制进行“向下转换”,转换和/或转换:C#casting ((BD)dict["Birthday"]).Day;,兼容引用类型(dict["Birthday"] as BD).Day;之间的显式转换。对于基本数据类型,您还可以使用转换,例如System.Convert.ToInt32(myLongValue)。 .NET中存在更多功能以支持转换工作。