我对这两个陈述之间的区别感到有些困惑。
这个工作并打印出属性结果就好了。
foreach( string key in result.Properties.PropertyNames )
{
foreach( object property in result.Properties[key] )
{
Console.WriteLine("{0}:{1}", key, property.ToString());
}
}
以下不起作用。我认为通过将特定属性转换为对象它将是同样的事情,但它显然不是:
foreach( string key in result.Properties.PropertyNames )
{
if( key == "name" )
{
Console.WriteLine("{0}:{1}", key, ((object)(result.Properties[key])).ToString() );
}
}
我得到了打印的result.Properties[key]
对象类型。
答案 0 :(得分:3)
这两个片段完全不同。
在第一个示例中,result.Properties[key]
是某种类型的集合(IEnumerable
)。它循环遍历集合中的每个对象,并将该对象的字符串表示形式(ToString()
)打印到屏幕上。
在第二个例子中,它只是打印集合本身的字符串表示,通常只是类型的名称。
注意:您几乎不希望ToString
包含集合的内容。
答案 1 :(得分:1)
不同之处在于,即使property
在第一个示例中是object
类型,实际属性仍然具有用于ToString()
的基础类型。您只是使用object
类型来保存更多派生类型。
在第二个示例中,您将其强制转换为类型object
,您告诉编译器“我不关心该属性的实际类型,请将其视为object
,以便它结束使用object.ToString()
代替property.ToString()
。
答案 2 :(得分:0)
属性是一个对象,具有属性名称,每个属性名称是一组值。 所以... result.Properties [key]将返回一个ResultPropertyValueCollection,它包含一个或多个值。
您可以枚举您在第一段代码中执行的这些值。
在第二个示例中,您希望显示此集合中的所有值。这可以通过LINQ轻松完成。我将代码分开以便更好地理解,但它可以写成一行:
foreach( string key in result.Properties.PropertyNames )
{
if( key == "name" )
{
IEnumerable collection = result.Properties[key];
string[] seperateValues = collection.Cast<object>().Select(o => o.ToString()).ToArray();
string joinedValues = String.Join(", ", seperateValues)
Console.WriteLine("{0}:{1}", key, joinedValues);
}
}