我试图基于预定的输入在foreach循环内调用不同的构造函数。
这是我目前拥有的,但是在某些参数上我的想法有些不合时宜,这只会导致很多相同的代码。
if(true)
{
XYZ.ToList().ForEach(xyz=> foo.AddBar(new Bar(a, b.ToList().Find(xyz))))
} else
{
XYZ.ToList().ForEach(xyz=> foo.AddBar(new Bar(b.ToList().Find(xyz))))
}
如果可能的话,我想要这样的东西:
XYZ.ToList().ForEach(xyz=> foo.AddBar(new Bar(true ? a : null, b.ToList().Find(xyz))))
传递参数似乎是不可行的,因为forEach循环还是我弄错了? 编辑: 类构造器:
public class Bar
{
public Bar(Foo a) { ... }
public Bar(Foo a, Baz b) { ... }
public Bar(Foo a, Baz b, Qux c) { ... }
}
最后,酒吧使用XmlSerialization进行序列化,因此id希望避免使用空参数
答案 0 :(得分:0)
因此,您有一个Bar
类,其中包含多个带有许多参数的构造函数:
public class Bar
{
public Bar(Foo a) { ... }
public Bar(Foo a, Baz b) { ... }
public Bar(Foo a, Baz b, Qux c) { ... }
}
您想有条件地调用构造函数。一种方法是创建一个工厂方法(或类),在其中准备您肯定需要的参数:
Bar GetBar(...)
{
var foo = GetFoo(...);
if (flag)
{
var baz = GetBaz(...);
return new Bar(foo, baz);
}
return new Bar(foo);
}
或者,更改构造函数,以便剩下一个,其余的都接受null参数:
public class Bar
{
public Bar(Foo a, Baz b, Qux c) { ... }
}
然后简单地用值或null来调用它:
var foo = GetFoo(...);
var baz = flag1 ? GetBaz(...) : null;
var qux = flag2 ? GetQux(...) : null;
var bar = new Bar(foo, baz, qux);
答案 1 :(得分:0)
您可以拥有一个带有所有参数的构造函数
public class Bar
{
Bar(TypeOfA? a, TypeOfB? b, TypeOfC? c...)
{
if (a == null)
{}
....
}
}
并致电
XYZ.ToList().ForEach(xyz=> foo.AddBar(new Bar(a, b.ToList().Find(...))))
,但是在这种情况下,将if条件从代码的一部分移到另一部分,并且您有一个构造函数,其参数接收null。 我认为最好使用许多构造函数和
if(true)
{
XYZ.ToList().ForEach(xyz=> foo.AddBar(new Bar(a, b.ToList().Find(...))))
} else
{
XYZ.ToList().ForEach(xyz=> foo.AddBar(new Bar(b.ToList().Find(...))))
}
答案 2 :(得分:0)
您也许可以使用?: Operator并有条件地更改构造函数
XYZ.ToList().ForEach(xyz=> foo.AddBar(true? new Bar(a, b.ToList().Find(...)) : new Bar(b.ToList().Find(...)) ))