我可以使用基于Object属性的强类型参数吗

本文关键字:类型参数 属性 Object 可以使 我可以 | 更新日期: 2023-09-27 18:24:33

我有一个对象列表。我有一个与列表类型相同的项目。

我想创建一个通用的扩展方法(称为Find),以基于单个obj及其强类型属性的任意列表从列表中查找项。

以下是我想如何调用方法:

var obj = new SomeObject() { ... } ;
var list = new List<SomeObject>() { ... };
// Find similar objects
list.Find(obj, x => x.Id,y => y.Description);

这种安排可能吗?

FirstOrDefault将按照下面的评论工作。然而,我正在寻找一种在不同场景中使用该模式的方法,这种方法可能不是简单的查找。

我可以使用基于Object属性的强类型参数吗

您可以执行此

public static T Find<T>(this IEnumerable<T> source, params Func<T,bool>[] condition)
{
    return source.FirstOrDefault(o => condition.All(f => f(o))); // use All for && or use Any for ||
}

使用

var item = list.Find(x=> x.Id == obj.Id,x=> x.Description == obj.Description);

如果您想通过将属性强制转换为对象来更普遍地进行此操作,则可以使用Object。但顺便说一句,这会慢一点,您必须注意自定义类型Equals方法必须被覆盖才能使其工作。

public static T Find<T>(this IEnumerable<T> source, T obj, params Func<T, object>[] condition)
{
    return source.FirstOrDefault(o => condition.All(f => f(o).Equals(f(obj))));
}

然后你可以这样称呼它。

var item = list.Find(obj, x => x.Id,y => y.Description);

如果要返回所有类似的项目,可以使用Where。只需将FirstOrDefault更改为Where,并将方法的返回类型更改为IEnumerable<T>

在我看来,与只使用普通的Where子句来过滤你想要的任何属性相比,你似乎并没有节省很多时间/精力。

var findResults = list.Where(x => x.Id == obj.Id || x.Description == obj.Description);

也许你应该考虑这样进行:

var myResult = from currentObject in mylist
               where currentObject == mySingleObject // change it by your matching criterias linked by && or || (as in if ...)
               // NB: you can also override the == operator in your object definition
               // but as mentionned below, it won't work for generic types
               select currentObject;