Поскольку у вас явно есть какое-то поле или свойство, определенное в вашем классе, которое вы можете агрегировать для получения среднего значения, вы можете опционально определить лямбда-функцию выбора в конструкторе, которая будет использоваться для оценки во время выполнения. Единственное предостережение в том, что поле / свойство должно быть открыто видимым для чтения, поскольку оно определено внешне. Этот простой класс должен выполнить то, что вы пытаетесь сделать. Я заметил, что тип возврата по умолчанию для linq.Average () был double, а не float. Так что я изменил это, но в остальном оно должно быть адекватным.
public class QueueT<T>
{
public QueueT(Func<T, int> avgSelector)
{
selector = avgSelector;
}
private Func<T, int> selector;
private object syncLock = new object();
private Queue<T> queue = new Queue<T>();
public double Average()
{
lock (syncLock)
{
return (from item in queue select selector(item)).Average();
}
}
}
Тип образца
public class Car
{
//
public int HP => 500;
}
Затем, когда вы создаете экземпляр
public class RealImplementationandUseClass
{
public RealImplementationandUseClass()
{
var q = new QueueT<Car>((c) => c.HP);
}
}
Таким образом, вы можете гарантировать, что селектор доступен для типа во время компиляции, и вам не нужно накладывать ограничения на универсальный тип для вашего класса очереди.