如何用C语言编写条件实例化#

How to write conditional instantiation in C#

提问人:Shakeer Hussain 提问时间:11/14/2023 最后编辑:Theodor ZouliasShakeer Hussain 更新时间:11/14/2023 访问量:52

问:

我有一个下面的 lambda 默认构造函数,它工作正常。Employee

this.For<IEmployee>().Use(() => new Employee());

现在,我想根据值将另一个构造器称为另一个构造器。
If 是带参数的调用构造函数。
如果为 ,则调用默认构造函数。
flagflagtrueEmployeeflagfalse

this.For<IEmployee>().Use(
if (flag)
{
    () => new Employee("Test");
}
else
{
    () => new Employee());
});
C# Lambda 默认构造函数

评论


答:

4赞 Dmitry 11/14/2023 #1
this.For<IEmployee>().Use(() => flag ? new Employee("Test") : new Employee());

评论

0赞 Shakeer Hussain 11/14/2023
谢谢,我尝试了上面的方法,但它抛出了这个错误“ 无法将 lambda 表达式转换为类型”string“,因为它不是委托类型。
0赞 Olivier Jacot-Descombes 11/14/2023
@ShakeerHussain,如果您的原始表达式与 lambda 表达式一起使用,那么这个具有相同签名 () 的新 lambda 表达式也将有效。UseFunc<Employee>
0赞 David 11/14/2023 #2

看起来你只是把语法/结构弄混了。lambda 的这一部分:

() => 

函数标头。它之后的一切都是函数。你正试图围绕它来包裹你的结构。这在概念上类似于:if

if (someCondition)
{
    public Employee SomeFunc() { return new Employee("Test"); }
}
else
{
    public Employee SomeFunc() { return new Employee(); }
}

正如你所看到的,这不是如何构建代码。相反,将逻辑移动到函数体。例如:

this.For<IEmployee>().Use(() => {
    if (flag)
    {
        return new Employee("Test");
    }
    else
    {
        return new Employee());
    }
});

(可以重构为更紧凑的内容,但出于说明目的,请留在这里。