我有一个可以包含不同类对象的通用列表。这些类具有相同的基类,具有Id属性。
我想在列表中搜索Id并提取第一个occourence,就像这样
T result = myGenericList.Where(i => i.Id == id).FirstOrDefault()
但是我无法进入这些属性,我只能得到:i =>岛
编辑: 我要求提供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
答案 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)