Найти элемент из общего списка

У меня проблема с получением записи из общего списка. Я создал общую функцию, из которой я хочу получить записи из любого типа класса. Ниже приведен пример кода:-

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);
}
Другие вопросы по тегам