C#,是否可以重新创建对象并访问方法和属性而无需创建新的对象变量?
例如:
foreach (object o in collection)
{
if (o is MyType)
{
(MyType)o.MyProperty = x
}
}
目前,我必须将o重新转换为另一个MyType变量[ex:MyType m =(MyType)o]才能访问MyType的方法或属性。这看起来很浪费,所以我想知道我是否缺少一些可以让我跳过新对象变量声明的机制。
答案 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;
}