分配前的空检查

时间:2014-11-17 19:05:54

标签: c# null operators extension-methods static-methods

有没有办法在不使用null声明的情况下在 分配 操作之前检查if? 有没有办法在一行中提供以下功能,类似于空合并运算符(??)或扩展方法:

if(myVar != null){ obj = myVar;}

我尝试使用扩展方法,但扩展方法不允许使用refout关键字作为第一个参数。我似乎无法找到任何内置的运营商来做到这一点。

重点是避免分配,因为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对象将输出空标记。换句话说,如果我不想让标签存在,那就不要设置它。

3 个答案:

答案 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;
   }
}