有没有办法在不使用null
声明的情况下在 分配 操作之前检查if
?
有没有办法在一行中提供以下功能,类似于空合并运算符(??
)或扩展方法:
if(myVar != null){ obj = myVar;}
我尝试使用扩展方法,但扩展方法不允许使用ref
或out
关键字作为第一个参数。我似乎无法找到任何内置的运营商来做到这一点。
重点是避免分配,因为obj
的propertyset属性设置为true,无论它被设置为null
还是其他。
意味着obj = myVar ?? null;
无效,obj = myVar != null ? myVar : null;
我可以使用静态方法但该方法应该在哪里?实用类?对象扩展类中的静态方法?
这些是单行ifs还是静态方法的唯一选择?
修改
我无法访问obj
这是我提供给我的许多第三方对象之一。
编辑2: 我有大量代码看起来类似于以下内容:
this.Header.InvoiceHeader.InvoiceTypeCode = row.Field<string>("InvoiceTypeCode");
this.Header.InvoiceHeader.PurchaseOrderDate = row.Field<DateTime?>( "PODate" ) ?? DateTime.Now;
this.Header.InvoiceHeader.PurchaseOrderNumber = row.Field<string>( "PONumber" );
this.Header.InvoiceHeader.SellersCurrency = row.Field<string>( "Currency" ) ?? "USD";
this.Header.InvoiceHeader.BuyersCurrency = row.Field<string>( "Currency" ) ?? "USD";
this.Header.InvoiceHeader.TradingPartnerId = this.EDITradingPartner.TradingPartnerID;
this.Header.InvoiceHeader.CustomerAccountNumber = row.Field<string>("CustomerAccountNumber");
this.Header.InvoiceHeader.CustomerOrderNumber = row.Field<string>("CustomerOrderNumber");
this.Header.InvoiceHeader.PromotionDealNumber = row.Field<string>("PromotionDealNumber");
这是将我的数据库映射到第三方xml对象,该对象具有太多节点,无法为每个节点编写包装器。如果属性的值设置为null
,则xml对象将输出空标记。换句话说,如果我不想让标签存在,那就不要设置它。
答案 0 :(得分:4)
如果您有智能设置器,实际上知道它的值更改,而不仅仅是检查它是否被调用,您可以这样做:
obj = myVar ?? obj;
如果您没有智能设定器,则无法绕过if
。您要放置的地方完全取决于您和您的编码偏好。
答案 1 :(得分:1)
由于我假设obj
是变量而不是属性,这是等价的,但我个人觉得if
更容易阅读:
obj = myVar ?? obj;
请注意,如果obj
只是一个变量,那么在将其设置为自身时没有任何副作用,但是如果您使用属性进行尝试:
obj.MyProperty = myVar ?? obj.MyProperty;
如果myVar
为null,则调用getter和setter;其中任何一个都可能具有原始if
语句不会出现的副作用。
答案 2 :(得分:0)
我建议使用一些方法。如果您将在不同的类中使用此逻辑,那么您需要使用util类,否则使用私有方法,或者从具有受保护实现的基类继承。
private void SetValue(ref object property, object value)
{
if (property != null) {
property = value;
}
}