我有一个通用列表,并尝试根据值得到项目,即
list.FirstOrDefault(u=>u.Key == key) // error 'T' does not contain definition for 'Key'
具有不同基类的泛型类型T
。
答案 0 :(得分:2)
根据T
填入List<T>
的位置,您可以在其上指定通用约束以具有接口(或基类)。
接口:
interface IHasKey { string Key { get; } } // or some other type for `Key`
通用约束:
where T : IHasKey
答案 1 :(得分:1)
您正在尝试使用Key而未指定T,因此我们不知道T类是否包含任何字段/属性Key。 你可以做的事情是使用抽象类/接口或尝试将你投射到包含&#34; Key&#34;的类中。 (假设您特别期待某些课程)。有关您的列表及其项目的更多详细信息,需要更精确的答案。 希望它可以提供帮助!
答案 2 :(得分:1)
使用通用方法时,您必须确保T具有属性Key
。这可以通过通用约束来实现。它可以是基类或接口:
interface IKeyedObject {
string Key { get; };
}
class BaseWithKey : IKeyedObject {
public string Key { get; set; };
}
class DerivedA : BaseWithKey {
}
class DerivedB : BaseWithKey {
}
class OtherWithKey : IKeyedObject {
public string Key { get; set; };
}
//Solution with base class (will work with BaseWithKey, DerivedA, DerivedB)
T GetItemBaseClass<T>(List<T> list, string key)
where T : BaseWithKey {
return list.FirstOrDefault(u=>u.Key == key);
}
//Solution with interface (will work with all classes)
T GetItemInterface<T>(List<T> list, string key)
where T : IKeyedObject {
return list.FirstOrDefault(u=>u.Key == key);
}