2015-12-01 24 views
5

Tôi có một tình huống mà tôi cần gán một số thuộc tính của đối tượng bên trong bộ khởi tạo đối tượng. Một số các đối tượng này có thể là null và tôi cần truy cập các thuộc tính của chúng, vấn đề là chúng quá nhiều và sử dụng một điều if/else không tốt.Có cách nào để bắt chước C# 6 Toán tử điều kiện Null trong C# 5

Ví dụ

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

Các joined.VisitePdvProduit có thể được null, và vấn đề là có giống như hàng chục bài tập như vậy (tôi chỉ mất một để rút ngắn code)

Các C# 6Null-Conditional operator là giải pháp hoàn hảo cho tình huống này, vấn đề là tôi đang ở trên C# 5 trong dự án này, có cách nào để bắt chước điều đó không?

+1

Tạo phương thức mở rộng – MikeSW

+1

Làm thế nào về 'visitJoins.AsEnumerable() .Vào (vj => vj.VisitePdvProduit! = Null) .Select (join => new VisitPDV()' –

+0

@ClayVerValen như tôi đã nói tôi có nhiều bài tập như vậy, tôi chỉ rút ngắn nó để tránh mã dài ở đây, làm cho đề nghị của bạn sẽ không giúp đỡ. – AymenDaoudi

Trả lời

6

Vâng, bạn có thể sử dụng một phương pháp mở rộng tiếp nhận một đại biểu accessor và chỉ thực hiện nó nếu mục không phải là 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); 
    } 
} 

Bạn có thể sử dụng nó ví dụ như thế này:

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

Bạn có thể dễ dàng tạo phiên bản của phương thức này cho các hoạt động không trả lại giá trị (ví dụ: bar.ConditionalAccess(_ => _.Foo())) hoặc trả về các loại giá trị.

+0

Điều này sẽ chỉ hoạt động cho việc mở rộng thuộc tính cấp cao nhất. – Amy

+1

@Amy Tại sao? Bạn có thể sử dụng phần mở rộng nhiều lần ... – i3arnon

+1

thx khá gọn gàng – AymenDaoudi

1

Như thế này. Xấu xí, nhưng phải làm gì.

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

Không xứng đáng một downvote, không chắc chắn lý do tại sao, đúng nó lil bit xấu xí như bạn nói, nhưng nó thực hiện công việc, và nó Không thể hiểu được, upvoted – AymenDaoudi

0

Nếu bạn đang nói về bán rất ngạc nhiên hành ?., sau đó là không. Không có cách nào để bắt chước cú pháp.

Điều bạn có thể làm là tạo phương thức mở rộng (hoặc phương pháp trợ giúp, phương pháp tĩnh, tốt nhất) hoặc phương pháp thể hiện làm việc với các thuộc tính.

Hoặc, như một người được đề xuất, chỉ cần sử dụng câu lệnh có điều kiện (nội dòng hoặc rõ ràng). Nhưng đó không phải là những gì bạn đang tìm kiếm, tất nhiên.

Một phương pháp khác (và nó là không phải ở tất cả được đề xuất) là bao quanh nhiệm vụ với try-catch. Nhưng đó là thực sự baaad giải pháp và tôi chỉ đề cập đến nó vì lợi ích đầy đủ.

+0

Không. [Toán tử này: '? .'] (https://msdn.microsoft.com/en-us/library/dn986595.aspx). –

+1

" nhà điều hành rất ngạc nhiên "? Đó có phải là lỗi đánh máy không? – Amy

+0

Có @NickWhaley rằng một, thx cho độ chính xác – AymenDaoudi

Các vấn đề liên quan