0

我对这两种说法之间的区别感到有些困惑。

这个可以正常工作并打印出属性结果。

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() );            
     }
}

我得到了 print 的对象类型result.Properties[key]

4

3 回答 3

3

这两个片段做了完全不同的事情。

在第一个示例中,result.Properties[key]是某种类型的集合 ( IEnumerable)。它循环遍历集合中的每个对象,并将该对象的字符串表示形式 ( ToString()) 打印到屏幕上。

在第二个示例中,它只是打印集合本身的字符串表示形式,通常只是类型的名称。
注意:您几乎永远不会想要ToString包含集合的内容。

于 2013-04-22T17:19:33.447 回答
1

不同之处在于,即使propertyobject第一个示例中的类型,实际属性仍然具有用于 的基础类型ToString()。您只是使用该object类型来保存更派生的类型。

在第二个示例中,您将其强制转换为 typeobject您是在告诉编译器“我不在乎属性实际上是什么类型,将其视为 anobject所以它最终使用object.ToString()而不是property.ToString().

于 2013-04-22T17:18:57.227 回答
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);             
     }
}
于 2013-04-22T17:37:19.947 回答