C#,是否可以重新创建对象并访问方法和属性而无需创建新的对象变量

时间:2012-08-26 16:50:43

标签: c# object methods casting

C#,是否可以重新创建对象并访问方法和属性而无需创建新的对象变量?

例如:

foreach (object o in collection)
{
    if (o is MyType)
        {
            (MyType)o.MyProperty = x
        }
 }

目前,我必须将o重新转换为另一个MyType变量[ex:MyType m =(MyType)o]才能访问MyType的方法或属性。这看起来很浪费,所以我想知道我是否缺少一些可以让我跳过新对象变量声明的机制。

5 个答案:

答案 0 :(得分:3)

您可以使用Linq:

foreach(MyType t in collection.OfType<MyType>()) {}

您也可以使用直接投射:

foreach(object o in collection)
{
    if(o is MyType)
    {
        ((MyType)o).MyProperty = x;
    }
}

或者,如果您知道或想要确定(如果集合是混合类型,请记住InvalidCastException是可能的),您可以使用Cast Linq方法:

// If your collection is all of the same type
foreach(MyType t in collection.Cast<MyType>()) {}

答案 1 :(得分:2)

您的代码不起作用,因为.的优先级高于强制转换。所以你需要添加括号:

foreach (object o in collection) 
{ 
    if (o is MyType) 
        { 
            ((MyType)o).MyProperty = x; 
        } 
 } 

答案 2 :(得分:2)

你需要两对括号。

((MyType)o).MyProperty = x;

否则,施法将应用于整个表达式。


y = (MyType)o.MyMethod(x);

相同
y = (MyType)(o.MyMethod(x));

这不是你想要的(它会转换MyMethod的结果)。而是写

y = ((MyType)o).MyMethod(x);

答案 3 :(得分:0)

是的,你可以施展

foreach(var t in collection.Cast<YourType>())
{
  t.MyProperty = x;
}

Nota:但是当您从引用类型传递到值类型或将值类型传递给引用类型时,您必须知道装箱或拆箱操作在您的内存中是昂贵的操作。

在这种情况下,您没有此约束。

答案 4 :(得分:0)

实现接口

interface MyInterface
{
 string MyProperty;
}

foreach(object o in collection)
{
MyInterface o= originalObject as MyInterface

if (MyInterface!= null)

  ((MyInterface)o).MyProperty = x;
}