搜索通用列表<t>获取Id属性

时间:2017-09-03 09:13:06

标签: c#

我有一个可以包含不同类对象的通用列表。这些类具有相同的基类,具有Id属性。

我想在列表中搜索Id并提取第一个occourence,就像这样

T result = myGenericList.Where(i => i.Id == id).FirstOrDefault()

但是我无法进入这些属性,我只能得到:i =&gt;岛

编辑: 我要求提供myGenericList的代码。在这里:

    public static IEnumerable<T> Initialize()
{
  List<T> allCalls = new List<T>();

  var phoneCalls = new PhoneCall[]
  {
    new PhoneCall{Id = 1, Date= DateTime.Now.AddDays(-1), DurationSec = 60, Phone = "", Region = new Country { From = "", To = ""}},
    ...
  };
  foreach (PhoneCall s in phoneCalls)
  {
    allCalls.Add(s as T);
  }

  var dataCalls = new DataCall[]
  {
    new DataCall{Id = 6, WebData = 5120, Phone = "", Region = new Country { From = "", To = ""}},
    ...
  };
  foreach (DataCall s in dataCalls)
  {
    allCalls.Add(s as T);
  }

  var smsCalls = new SmsCall[]
  {
    new SmsCall{Id = 6, SmsData = 512, Phone = "", Region = new Country { From = "", To = ""}},
    ...
  };
  foreach (SmsCall s in smsCalls)
  {
    allCalls.Add(s as T);
  }

  return allCalls;

关于T是我在Repository.cs类顶部定义的类

public class Repository<T> : IRepository<T> where T : class

2 个答案:

答案 0 :(得分:3)

您应该做的是定义T是什么,而不是将项目转换为T。由于编译器无法知道T是什么,因此它不知道它具有Id属性。使用通用约束来执行此操作:

public static IEnumerable<T> Initialize<T where T : BaseClass>()
{
    var allCalls = new List<T>();
    allCalls.Add(new PhoneCall { /* Details */};
    return allCalls;
}

问题更新后 - 将约束从其中一个函数移动到其中一个

此外,您可以使用获取谓词的FirstOrDefault重载:

var result = myGenericList.FirstOrDefault(i => i.Id == id);

答案 1 :(得分:1)

您是否尝试过投射到基类?

myGenericList
     .Cast<BaseClass>()
     .FirstOrDedault(i => i.Id === id)

或者

myGenericList.FirstOrDefault(i => (i as BaseClass).Id === id)