Member 1097736 Ответов: 1

Как запросить общий список с помощью LINQ?


foreach (T setName in setNames)
{
 List<T> list = objectList.Where(x => x.QualificationID == setName).ToList();
 redisClient.SetAdd<string>("Qualification:" + setName, list.Select(x => x.ProductID).ToString());
}

В строке 3 T не содержит определения для 'QualificationID', и не может быть найден метод расширения 'QualificationID', принимающий первый аргумент типа T.
Аналогично в строке 4,
T не содержит определения для 'ProductID' и не может быть найден метод расширения 'ProductID', принимающий первый аргумент типа T

Как мы можем запросить список универсального типа?

Что я уже пробовал:

foreach (T setName in setNames)
{
 List<T> list = objectList.Where(x => x.QualificationID == setName).ToList();
 redisClient.SetAdd<string>("Qualification:" + setName, list.Select(x => x.ProductID).ToString());
}

1 Ответов

Рейтинг:
2

OriginalGriff

Когда вы используете универсальные методы, он "заполняет пробелы" от типа коллекции - поэтому свойства и методы, которые вы можете использовать для каждого объекта, зависят от типа коллекции.
Таким образом, коллекция точечных объектов может использовать точечные свойства:

List<Point> points = GetPoints();
List<Point> leftColumn = points.Where(p => p.X <= 10).ToList();
Но коллекция строк позволит вам использовать строковые свойства:
List<string> strings = GetStrings();
List<string> shortStrings = strings.Where(s => s.Length <= 10).ToList();

Независимо от того, как объявлена ваша коллекция, определяет, какие свойства и методы вы можете использовать внутри своего класса, а не какие элементы в коллекции могут быть. Так что если вы используете базовый класс:
List<object> strings = GetStrings();
List<string> shortStrings = strings.Where(s => s.Length <= 10).ToList();
Вы получите ошибку, потому что Length не является собственностью object класс, даже если все объекты в коллекции являются строками и имеют длину - система не "знает", что все объекты в классе всегда будут строками:
List<object> strings = new List<object>();
strings.Add("Hello!");
strings.Add(666);
strigns.Add(new Point(12, 42));
List<string> shortStrings = strings.Where(s => s.Length <= 10).ToList();
Так что смотрите на что setNames объявляется как-то, что управляет тем, какие свойства вы можете использовать.


Member 1097736

setNames-это массив типов T. T[] setNames .
Что мы можем сделать в таком случае?

OriginalGriff

Если вы не укажете, что T может быть частью вашего общего объявления класса / метода, оно неявно является объектом - что означает, что вы можете использовать только свойства и методы объекта.

Покажите строку, в которой вы впервые вводите T: объявление класса или метода