我有一个接口(interface)类 FooBar
和两个具体类,Foo
和 Bar
。
如果我在 FooBar
中 foreach
,我如何根据我的项目是 Foo
还是 使用不同的指令集>栏
? (例如,因为 Foo
和 Bar
没有相同的属性)。
最佳答案
三个选项。
如果可能,Foo
和 Bar
应该有一个共同的基类 FooBarBase
—— 或者实现一个共同的接口(interface),你的 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>>();
}
}
最后,您可以使用 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/