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