Найти элемент из общего списка
У меня проблема с получением записи из общего списка. Я создал общую функцию, из которой я хочу получить записи из любого типа класса. Ниже приведен пример кода:-
public void Test<T>(List<T> rEntity) where T : class
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
Пожалуйста, предложите. Заранее спасибо.
2 ответа
При таком методе обычным вопросом для компилятора является "что такое T"? Если это просто класс, это может быть что угодно, даже StringBuilder
как упоминал Джон, и нет никакой гарантии, что у него есть свойство "Id". Так что это даже не скомпилирует так, как сейчас.
Чтобы это работало, у нас есть два варианта:
A) Измените метод и сообщите компилятору, какой тип ожидать
Б) Используйте рефлексию и используйте операции времени выполнения (лучше избегайте этого, когда это возможно, но это может пригодиться при работе со сторонними библиотеками).
A - Интерфейсное решение:
public interface IMyInterface
{
int Id {get; set;}
}
public void Test<T>(List<T> rEntity) where T : IMyInterface
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
B - Отражение раствора:
public void Test<T>(List<T> rEntity)
{
var idProp = typeof(T).GetProperty("Id");
if(idProp != null)
{
object id = 1;
var result = rEntity.Where(x => idProp.GetValue(x).Equals(id));
}
}
Вы чаще всего определяете базовый класс, у которого есть свойство id, а ваш T наиболее наследуется от этого базового класса.
public class BaseClass{
public object ID;
}
и вы можете изменить свою функцию следующим образом:
public void Test<T>(List<T> rEntity) where T : BaseClass
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}