簡體   English   中英

具有泛型類型約束的 C# 多態性

[英]C# Polymorphism with generic type constraints

我正在為IQueryable<Item>創建一個擴展方法,其中Item是實體框架的實體。

擴展方法在第一行返回一個或多個屬性值,如果沒有找到行或屬性值為 null,則返回 null。

這是代碼:

internal static TResult FirstOrDefault<TResult>(this IQueryable<Item> items,
        Expression<Func<Item, TResult?>> selector, TResult defaultValue)
        where TResult : struct
{
    var ret = items.Select(selector).FirstOrDefault();

    if (ret == null || !ret.HasValue)
    {
        return defaultValue;
    }

    return ret.Value;
}

internal static TResult FirstOrDefault<TResult>(this IQueryable<Item> items,
        Expression<Func<Item, TResult>> selector, TResult defaultValue)
        where TResult : class
{
    return items.Select(selector).FirstOrDefault() ?? defaultValue;
}

由於屬性可能具有值類型值,我決定為值類型和引用類型創建兩個擴展方法。

但是當我使用該方法時(見下文),

_dbContext.Items.Where(i => i.Id == '...').FirstOrDefault(i => i.Modified, DateTime.Now)

VS 警告

類型“DateTime”必須是引用類型,以便將其用作泛型類型或方法“EFExtensions.FirstOrDefault(IQueryable, Expresion>, TResult)”中的參數“TResult”

我知道這意味着 VS 嘗試使用第二個擴展方法編譯此方法,而DateTime將違反where TResult : class約束。

如何在不修改方法名稱的情況下讓 VS 使用一個?

或者有沒有更好的方法來實現我的目標?

任何答案將不勝感激。

謝謝 :)

在您的第一個方法中, Expression的返回類型是一個可為空的TResult因此您需要做的就是返回它。 這可以通過演員表來完成:

_dbContext.Items
    .Where(i => i.Id == '...')
    .FirstOrDefault(i => (DateTime?)i.Modified, DateTime.Now);

暫無
暫無

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

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