【问题标题】:Find item from generic list从通用列表中查找项目
【发布时间】:2017-04-12 10:28:22
【问题描述】:

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

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

请提出建议。提前致谢。

【问题讨论】:

  • 您希望Test&lt;Type&gt;() 做什么?还是Test&lt;StringBuilder&gt;()?在我看来,您的T 需要更多的约束......
  • 这段代码甚至不应该编译,因为 T 是一个类并不意味着 T 是一个具有名为 id 的属性的对象集合。
  • 嗨 Jon,'T' 是一个通用类名,我们将在调用上述方法时传递它。谢谢
  • 真的不清楚你在这里做什么。你为什么不直接使用list.Where(...)
  • 你定义了一个具有 id 属性的基本类,并且你的 T 大部分是从该基本类继承的,在发布的代码中你最有编译器错误

标签: c# linq generic-list


【解决方案1】:

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

为了让它发挥作用,我们有两个选择:

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

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

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

【讨论】:

  • 感谢 Fabjan,您节省了我很多时间。反射解决方案对我有用。再次感谢。
【解决方案2】:

你定义了一个基本类,它有 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);
}

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2018-11-24
    • 2016-09-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多