考虑到:
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;
以上代码无效。欢迎任何建议。
答案 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的实例都是所有类型:BD
和System.Object
通过继承。如果已经实现了任何接口,那么这些接口也将是实例的其他数据类型。
但是类型Object
仅显示Object成员(以及它继承的内容,仅此而已),即使数据类型BD
也是其中的一部分。
要向C#编译器显式声明您使用多个可用数据类型的意图,您将不得不使用C#/ .NET中的一种机制进行“向下转换”,转换和/或转换:C#casting ((BD)dict["Birthday"]).Day;
,兼容引用类型(dict["Birthday"] as BD).Day;
之间的显式转换。对于基本数据类型,您还可以使用转换,例如System.Convert.ToInt32(myLongValue)
。 .NET中存在更多功能以支持转换工作。