通用列表firstOrDefault

时间:2017-02-02 13:58:07

标签: c# linq

我有一个通用列表,并尝试根据值得到项目,即

list.FirstOrDefault(u=>u.Key == key) // error 'T' does not contain definition for 'Key'

具有不同基类的泛型类型T

3 个答案:

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