c# - Foreach - 不同的指令取决于 List<FooBar> 中的项目类型

标签 c# polymorphism

我有一个接口(interface)类 FooBar 和两个具体类,FooBar

如果我在 FooBarforeach,我如何根据我的项目是 Foo 还是 使用不同的指令集>栏 ? (例如,因为 FooBar 没有相同的属性)。

最佳答案

三个选项。

如果可能,FooBar 应该有一个共同的基类 FooBarBase —— 或者实现一个共同的接口(interface),你的 FooBar ——它定义了一些虚拟方法,比如 DoStuff()FooBar 都适本地实现了 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>>();
    }
}

最后,您可以使用 dynamic 以奇怪的、深奥的、离奇的方式做到这一点:

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”。

关于c# - Foreach - 不同的指令取决于 List<FooBar> 中的项目类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43786920/

相关文章:

c# - 比较两个键值对列表

c# - LINQPad:使用 (.NET4) VS2010 程序集时出现 "BadImageFormatException"?

c# - 如何使用一个StreamWriter写入多个底层流?

c# - 事件处理程序性能

c# - 在不同的命名空间 C# 中重写方法

swift - Swift 中的继承和多态

c++ - 如果调用非虚拟实现,是否会通过 vtable 进行函数分派(dispatch)?

C++危险的类型转换代码

c++ - 动态多态性未在 C++ 中正确实现

c# - 从特定的选项卡索引开始并在末尾停止