7

使用对象初始化器,是否可以选择包含属性设置?

例如:

Request request = new Request
{
    Property1 = something1,
    if(something)
        Property2 = someting2,                                      
    Property3 = something3
};
4

3 回答 3

4

不是我知道的。很确定你唯一的选择是这样做:

Request request = new Request
{
    Property1 = something1,
    Property3 = something3
};
if(something)
    request.Property2 = someting2;

或者,如果您可以将其设置为默认/空值,您也可以这样做:

Request request = new Request
{
    Property1 = something1,
    Property2 = something ? someting2 : null,
    Property3 = something3
};   
于 2010-02-10T02:52:12.493 回答
2

不,对象初始化器被翻译成一个愚蠢的 set 语句序列。

显然,您可以通过 hack 来实现类似的功能,例如将属性设置为您知道的默认值(例如new Request { Property2 = (something ? something2 : null) }),但是 setter 仍然会被调用——当然,如果 Request 的实现者会产生意想不到的后果决定更改属性的默认值。所以最好避免这种技巧,并通过以旧的预对象初始化器方式编写显式集合语句来进行任何条件初始化。

于 2010-02-10T02:52:02.507 回答
0

不,因为这些是静态调用,它们不能根据某些条件在运行时删除或添加。

您可以有条件地更改值,如下所示:

Foo foo = new Foo { One = "", Two = (true ? "" : "bar"), Three = "" };
于 2010-02-10T02:53:17.577 回答