我创建了一个接受动态列表、对象和两个参数名称的方法。我想使用 Enumerable.Any 方法返回一个 bool 值,该方法具有基于传递给方法的参数名称的匹配条件。
public static bool CheckDuplicate(List<T> list, Object obj, string param1, string param2)
{
return list.Any(item => item.pararm1 = obj.param1 && item.param2 = obj.param2);
}
我想根据动态提供的条件找到与obj对象的值匹配的项目。
最佳答案
似乎您想要的是比较通过成员变量的名称访问的成员变量。这称为反射。这是我的解决方案:
首先添加一个扩展方法来帮助我们通过名称获取成员变量(来自 this SO answer ):
static class Extension
{
public static object GetPropValue(this object src, string propName)
{
return src.GetType().GetProperty(propName).GetValue(src, null);
}
}
那么,你的函数将是:
public static bool CheckDuplicate<T>(IEnumerable<T> list, object obj, string param1, string param2)
{
return list.Any(item =>
item.GetPropValue(param1).Equals(obj.GetPropValue(param1)) &&
item.GetPropValue(param2).Equals(obj.GetPropValue(param2))
);
}
我用这个测试了这个功能。它打印 True
:
static void Main(string[] args)
{
var theList = Enumerable.Range(0, 10).Select(i => new Tuple<int, int>(i, i + 1));
Console.WriteLine(CheckDuplicate(theList, new { Item1 = 5, Item2 = 6 }, "Item1", "Item2"));
Console.ReadKey();
}
但是,在生产中使用时,您可能需要确保 param1
和 param2
实际存在,并且还请查找并考虑 之间的差异。 Equals()
和 ==
。注意到 GetPropValue()
返回的值被装箱可能会很有用。
关于c# - 我可以动态地将参数添加到 IEnumerable.Any 方法的 LINQ 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55847422/