c# – Foreach – 根据List中项目的类型不同的说明

我有一个接口类FooBar和两个具体的类,Foo和Bar.

如果我在FooBar中使用,我如何根据我的项目是Foo还是Bar来使用不同的指令集? (例如,因为Foo和Bar没有相同的属性).

解决方法:

三种选择.

如果可能的话,Foo和Bar应该有一个公共基类FooBarBase – 或者实现一个通用接口,你的FooBar – 它定义了一些虚拟方法,比如DoStuff(). Foo和Bar各自适当地实现DoStuff().

由于你已经有了一个界面,你基本上就在那里.

public interface FooBar {
    void DoStuff(SomeFrameworkThing x);
}

List<FooBar> myFooAndBarList = new myFooAndBarList() { ... };

var thing = new SomeFrameworkThing(/* long list of murky parameters, all different */);

foreach (var fb in myFooAndBarList) {
    fb.DoStuff(thing);
}

但如果这不可能,或者你正在做的具体细节使它变得非常复杂(例如,你想让它们做完全不相关的东西),你就可以这样做.只需查看代码,您就可以了解为何选择上述版本.在C#7中,有更好的语法,但我还没有安装它来测试(1).

foreach (var o in myFooAndBarList) {
    if (o is Foo) {
        var f = o as Foo;
        f.FooMethod();
        f.FooProperty = "lol";
    }
    else if (o is Bar) {
        var b = o as Bar;
        b.BarMethod(234, 345);
        b.BarProp = new Dictionary<Foo, List<Bar>>();
    }
}

最后,你可以用动态的奇怪,深奥,奇异的方式做到这一点:

public void DoStuff(Foo f) {
    //  stuff
}

public void DoStuff(Bar b) {
    //  other stuff
}

foreach (dynamic d in myFoAndBarList) {
    DoStuff(d);
}

Try it. I’m not pulling your leg.我不推荐这种方法;我建议使用第一种方法,如果您坚持使用第二种方法,可能会推荐第二种方法.

(1)我坐在这里观看Visual Studio安装程序一小时.目前,状态文本显示“NO SYNTAX FOR YOU”.

上一篇:java – 使用多态?


下一篇:Java中的继承和多态