[英]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.