c# - 从通用列表中查找项目

标签 c# linq generic-list

我在从通用列表中获取记录时遇到问题。我创建了一个通用函数,我想从中获取任何类型的类的记录。以下是示例代码:-

public void Test<T>(List<T> rEntity) where T : class
{
    object id = 1;
    var result = rEntity.Where(x => x.id == id);
}

请推荐。提前致谢。

最佳答案

使用这样的方法,编译器通常会问“什么是 T”? 如果它只是一个类,它可以是任何东西,甚至是 Jon 提到的 StringBuilder 并且不能保证它具有属性“Id”。所以它甚至不会像现在这样编译。

为了让它工作,我们有两个选择:

A) 改变方法并让编译器知道期望的类型

B) 使用反射和运行时操作(最好尽可能避免这种情况,但在使用第 3 方库时可能会派上用场)。

A - 接口(interface)解决方案:

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));
    }
}

关于c# - 从通用列表中查找项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366996/

相关文章:

需要 C# 密码帮助

C# - List<T>.Remove() 总是删除列表中的第一个对象

java - 方法参数的泛型类型

java - List<Object> abcList 和方法重载

c# - 将字节交换/移位代码片段从 C++ 转换为 .NET

c# - COM 无法启动编译为 AnyCPU 的进程外 .Net 服务器

c# - 实体模型中可以使用私有(private) setter 吗?

C# - 带有 OR 子句的 LINQ 语句

c# - EF Core 3.0 .Include() 链的时间比 2.2 长约 5-10 倍

c# - LINQ - 选择一个类列表作为类成员的字段