如何基于LinQ查询中的输入使用不同的构造函数?

时间:2019-04-17 09:55:01

标签: c# linq

我试图基于预定的输入在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希望避免使用空参数

3 个答案:

答案 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(...)) ))