[英]ASP.NET MVC/C#: Can I avoid repeating myself in a one-line C# conditional statement?
在視圖中的表中顯示Customer的郵件地址時,請考慮以下代碼:
<%: Customer.MailingAddress == null ? "" : Customer.MailingAddress.City %>
我發現自己使用了相當數量的這些三元條件語句,我想知道是否有一種方法可以在條件中引用回被評估的對象,以便我可以在表達式中使用它。 也許是這樣的事情:
<%: Customer.MailingAddress == null ? "" : {0}.City %>
這樣的事情存在嗎? 我知道我可以創建一個變量來保存值,但是將所有內容保存在視圖頁面中的一個緊湊的小語句中會很好。
謝謝!
你可以用??
運算符用於與null進行比較。
Customer.MailingAddress == null ? "" : Customer.MailingAddress;
以上可以改寫如下:
Customer.MailingAddress ?? "";
在你的情況下,我通常創建擴展方法:
public static TValue GetSafe<T, TValue>(this T obj, Func<T, TValue> propertyExtractor)
where T : class
{
if (obj != null)
{
return propertyExtractor(obj);
}
return null;
}
使用方式如下:
Customer.GetSafe(c => c.MailingAddress).GetSafe(ma => ma.City) ?? string.Empty
不,沒有辦法在不創建變量或復制自己的情況下准確地執行您的要求,盡管您可以執行以下操作:
(Customer.MailingAddress ?? new MailingAddress()).City ?? string.Empty
這假定默認情況下新的MailingAddress將使其city屬性/字段為null。
如果創建新的MailingAddress將city字段/屬性初始化為空字符串,則可以刪除最后一個空合並。
但這實際上並不短,而且在我看來更為苛刻,而且幾乎肯定不那么高效。
為什么不在包含該條件的Customer對象上創建屬性並直接調用它? 即
Customer.FormattedMailingAddress
我會編寫代碼但是我在移動設備上,你只需要在get{}
相同的條件。
我同意@Dave,為您的Customer類創建一個擴展。
像這樣的東西:
public static class CustomerExtension
{
public static string DisplayCity(this Customer customer)
{
return customer.MailingAddress == null ? String.Empty : customer.MailingAddress.City
}
}
然后你可以像這樣調用你的方法:
myCustomer.DisplayCity();
(注意:擴展不能作為屬性創建,因此這必須是一個方法。有關詳細信息,請參閱C#是否具有擴展屬性? )
您可以創建一個擴展方法來獲取值或返回一個空字符串:
public static string GetValue<T>(this T source, Func<T, string> getter)
{
if (source != null)
return getter(source);
return "";
}
然后叫它:
<%: Customer.MailingAddress.GetValue(x=>x.City) %>
這適用於任何對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.