我有一个接口类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”.