我有一些重復性很高的代碼,它們總是具有相同的結構,只是使用資料庫中的不同列來訪問它并做類似的事情
一個典型的查詢如下所示:
var portfolioIds = context.PortSelMotorSeries
.Select(x => new { x.Id, x.InstallationAltitudeMax })
.ToList();
現在我想使用一個通用函式進行依賴反轉,并將選擇器函式作為委托傳遞給查詢:
private void ForEachIterate<T1>(Func<MotorSeriesDb, T1> selectorFunc): where T1 : (int Id, double Value)
{
...
var portfolioIds = context.PortSelMotorSeries
.Select(selectorFunct)
.ToList();
...
}
這樣我就可以使用自己的選擇器呼叫查詢:
ForEachIterate(x => new { Id = x.Id, Value = x.InstallationAltitudeMax });
ForEachIterate(x => new { Id = x.Id, Value = x.TemperatureMax });
使用“where T1 : (int Id, double Value)”指定約束會導致編譯器錯誤 CS0701。
離開它會導致其他編譯器錯誤。
有沒有辦法在泛型函式中使用元組?
uj5u.com熱心網友回復:
一方面,您將元組((int Id, double Value)事物)與匿名類(事物)混淆了new { Id = x.Id, Value = x.TemperatureMax }。它們甚至不相關,因此您的代碼永遠不會按原樣作業。
另一方面,如果您只想強制用戶輸出某種特定型別的元組,您可以執行以下操作:
private void ForEachIterate(Func<MotorSeriesDb, (int, double)> selectorFunc)
{
...
var portfolioIds = context.PortSelMotorSeries
.Select(selectorFunct)
.ToList();
...
}
// call like:
ForEachIterate(x => (x.Id, x.InstallationAltitudeMax));
請注意,您的功能根本沒有通用性。這引出了我的第三點:您錯過了 Linq 的全部要點。您談論控制反轉,但您是開始將其反轉到錯誤方向的人。
您已經有一個允許任意選擇的構造:context.PortSelMotorSeries. 只需使用 Linq 在呼叫站點中選擇您想要的內容即可。
uj5u.com熱心網友回復:
如果您嘗試這樣做,它可能會起作用:
private static void ForEachIterate<T1>(Func<MotorSeriesDb, T1> selectorFunc) where T1 : Tuple<int, double>
{
var portfolioIds = context.PortSelMotorSeries
.Select(selectorFunct)
.ToList();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477244.html
