簡體   English   中英

有沒有辦法在C#5中模仿C#6 Null-Conditional運算符

[英]Is there a way to Imitate C# 6 Null-Conditional operator in C# 5

我有一種情況需要在對象初始化程序中分配一些對象的屬性。 其中一些對象可以為null,我需要訪問它們的屬性,問題是它們太多了,使用if / else的東西並不好。

visits = visitJoins.AsEnumerable().Select(joined => new VisitPDV()
{
    VisiteId = joined.Visite.VisiteId.ToString(),
    NomPointDeVente = joined.VisitePdvProduit.PointDeVente.NomPointDeVente,             
});

joined.VisitePdvProduit可以為null,問題是有幾十個這樣的賦值(我只用了一個來縮短代碼)

C# 6 Null-Conditional operator是這種情況的完美解決方案,問題是我在這個項目的C# 5上,有沒有辦法模仿呢?

好吧,您可以使用一個接收訪問者委托的擴展方法,只有在該項不為null時才執行它:

public static TResult ConditionalAccess<TItem, TResult>(this TItem item, Func<TItem, TResult> accessor) where TResult : Class
{
    if (item == null)
    {
        return null;
    }
    else
    {
        return accessor(item);
    }
}

您可以使用它,例如:

NomPointDeVente = joined.VisitePdvProduit.ConditionalAccess(_ => _.PointDeVente.NomPointDeVente);

您可以輕松地為不返回值的操作(即bar.ConditionalAccess(_ => _.Foo()) )或返回值類型創建此方法的版本。

像這樣。 丑陋,但必須做什么。

 visits = visitJoins.AsEnumerable().Select(joined => new VisitPDV()
 {
     VisiteId = joined.Visite.VisiteId.ToString(),
     NomPointDeVente = (joined.VisitePdvProduit == null) ? null : joined.VisitePdvProduit.PointDeVente.NomPointDeVente,             
 });

如果你在談論半非常驚訝的操作員 , 那就不要。 沒有辦法模仿語法。

但是,您可以做的是創建擴展方法(或輔助方法,最好是靜態方法)或使用屬性的實例方法。

或者,正如有人建議的那樣,只需使用條件語句(內聯或顯式)。 但當然,這不是你想要的。

另一種方法(並且根本推薦)是使用try-catch包圍賦值。 但這確實是baaad解決方案,我只是為了完整性而提到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM