C#,是否可以在不创建新的对象变量的情况下重铸对象并访问方法和属性
C#,是否可以在不创建新对象变量的情况下重铸对象并访问方法和属性 例如:C#,是否可以在不创建新的对象变量的情况下重铸对象并访问方法和属性,c#,object,methods,casting,C#,Object,Methods,Casting,C#,是否可以在不创建新对象变量的情况下重铸对象并访问方法和属性 例如: foreach (object o in collection) { if (o is MyType) { (MyType)o.MyProperty = x } } 目前,为了访问MyType的方法或属性,我必须将o重新转换为MyType的另一个变量[ex:MyType m=(MyType)o]。这似乎是浪费,所以我想知道我是否缺少一些机制,可以让我跳过新
foreach (object o in collection)
{
if (o is MyType)
{
(MyType)o.MyProperty = x
}
}
目前,为了访问MyType的方法或属性,我必须将o重新转换为MyType的另一个变量[ex:MyType m=(MyType)o]。这似乎是浪费,所以我想知道我是否缺少一些机制,可以让我跳过新对象变量的声明。您可以使用Linq:
foreach(MyType t in collection.OfType<MyType>()) {}
或者,如果您知道或希望确保(请记住,如果集合是混合类型,则可能出现
InvalidCastException
),您可以使用Cast
Linq方法:
// If your collection is all of the same type
foreach(MyType t in collection.Cast<MyType>()) {}
//如果集合的类型都相同
foreach(collection.Cast()中的MyType t){}
是的,你可以投
foreach(var t in collection.Cast<YourType>())
{
t.MyProperty = x;
}
foreach(collection.Cast()中的var t)
{
t、 MyProperty=x;
}
注:但您必须知道,当您从引用类型传递到值类型,或从值类型传递到引用类型时,装箱或拆箱操作在内存中是昂贵的操作
在这种情况下,您没有这种约束 您的代码不起作用,因为
的优先级高于强制转换。因此,您需要添加括号:
foreach (object o in collection)
{
if (o is MyType)
{
((MyType)o).MyProperty = x;
}
}
你需要两对括号
((MyType)o).MyProperty = x;
否则,将对整个表达式应用强制转换
与
y = (MyType)(o.MyMethod(x));
这不是您想要的(它会强制转换MyMethod
的结果)。而是写
y = ((MyType)o).MyMethod(x);
实现一个接口
interface MyInterface
{
string MyProperty;
}
foreach(object o in collection)
{
MyInterface o= originalObject as MyInterface
if (MyInterface!= null)
((MyInterface)o).MyProperty = x;
}
你需要的是
类型
,而不是类型转换
,以防止出现无效类型异常
@christorcurrens OP的代码符合类型
,而不是类型转换
,因为他正在检查类型是否符合类型
@Christopher我知道,但OP明确检查如果(x是T)
这意味着集合可能还包含其他元素,这使得Cast
阻塞。谢谢,是的,集合是混合类型的,我正在尝试避免InvalidCastException。我所说的“浪费”仅仅是指可能不需要的额外代码行。谢谢你的回复。我不明白你说的“浪费”是什么意思。这不像编译器做了什么特殊的事情,因为你声明了一个局部变量,如果你只说((MyType)o).MyProperty
,它就不会这样做。而且,是
,演员阵容不受欢迎。使用<代码>作为< /代码>,检查无效性:为什么你认为它是浪费的?你是说它太冗长了吗?
y = ((MyType)o).MyMethod(x);
interface MyInterface
{
string MyProperty;
}
foreach(object o in collection)
{
MyInterface o= originalObject as MyInterface
if (MyInterface!= null)
((MyInterface)o).MyProperty = x;
}