C#将可枚举的强制转换到接口
如果以前有人问过类似的问题,我会提前道歉。如果是这样,请告诉我,因为我找不到合适的答案 我正在处理的情况需要一些复杂的诡计来获取一组对象,我需要将这些对象作为参数传递给我的方法。然而,我在试图以一种可用的方式将这组对象强制转换到我的方法时遇到了问题。这是代码的简化版本:C#将可枚举的强制转换到接口,c#,wpf,generics,collections,casting,C#,Wpf,Generics,Collections,Casting,如果以前有人问过类似的问题,我会提前道歉。如果是这样,请告诉我,因为我找不到合适的答案 我正在处理的情况需要一些复杂的诡计来获取一组对象,我需要将这些对象作为参数传递给我的方法。然而,我在试图以一种可用的方式将这组对象强制转换到我的方法时遇到了问题。这是代码的简化版本: public void OnMouseClick(object sender, MouseButtonEventArgs e) { var value = (sender as (DataGridCell)).[...].G
public void OnMouseClick(object sender, MouseButtonEventArgs e) {
var value = (sender as (DataGridCell)).[...].GetValue(context, null);
var objects = value as ObservableCollection<IViewModelObject>;
myMethod(objects);
}
public void myMethod(IEnumerable<IViewModelObject> objects) {
doStuff(objects);
}
public interface IViewModelObject { }
public class ViewModelObject1 : IViewModelObject { }
public class ViewModelObject2 : IViewModelObject { }
mouseclick上的公共void(对象发送器,鼠标按钮ventargs e){
var value=(发送方为(DataGridCell)).[…]GetValue(上下文,null);
var对象=作为可观察集合的值;
方法(对象);
}
公共void myMethod(IEnumerable对象){
杜斯塔夫(对象);
}
公共接口IViewModelObject{}
公共类ViewModelObject1:IViewModelObject{}
公共类ViewModelObject2:IViewModelObject{}
当前,对象总是空的,因为强制转换失败。但是,如果我这样做,演员阵容就会成功
var objects = value as ObservableCollection<ViewModelObject1>;
var objects=作为可观察集合的值;
但是这使得我无法在我的方法中使用接口,天知道我有很多类实现该接口,并且希望避免为所有类编写语句
请注意,myMethod不需要知道正在使用什么实现类,我可能会使用IEnumerable,这仍然有效。不幸的是,演员阵容也失败了
我猜编译器不喜欢将子类强制转换为它们的基类,但我觉得仍然应该有一种方法来实现类似的效果。有什么想法吗?
可观察的集合
是不变的,很像列表
。返回null
而不是强制转换异常的原因是,您是从对象
强制转换,而不是从可观察集合
强制转换
考虑以下几点:
interface IFoo { }
class Foo : IFoo { }
void Main()
{
var foo = new ObservableCollection<Foo>();
object oFoo = foo;
// The following will compile, but will always be null as the cast fails:
var nullValue = oFoo as ObservableCollection<IFoo>;
// The following will throw a compilation error,
// as the compiler recognizes the invalid conversion
var compileError = foo as ObservableCollection<IFoo>;
}
你可以使用“值为IEnumerable”也许你有协方差/反方差问题,你检查过了吗?
var foo = new ObservableCollection<Foo>();
var bar = new ObservableCollection<IFoo>(foo as IEnumerable<IFoo>);
var objects = value as IEnumerable<IViewModelObject>;
myMethod(objects);