我可以使用基于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将按照下面的评论工作。然而,我正在寻找一种在不同场景中使用该模式的方法,这种方法可能不是简单的查找。
您可以执行此
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;