簡體   English   中英

ASP.NET MVC / C#:我可以避免在單行C#條件語句中重復自己嗎?

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

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