考虑以下功能
public static string UpdateCommand<T>(List<string> Except=null,List<string> Only=null)
{
if (Except != null && Only != null)
{
throw new Exception();
}
List<PropertyInfo> properties = typeof(T).GetProperties().ToList();
if (Except != null)
{
for (int i = properties.Count; i-- > 0; )
{
if (Except.Contains(properties[i].Name)) properties.RemoveAt(i);
}
}
if(Only != null)
{
for (int i = properties.Count; i-- > 0; )
{
if (!Only.Contains(properties[i].Name)) properties.RemoveAt(i);
}
}
//etc...
}
它需要两个可选参数,它们都可以为null,或者它们中的任何一个都可以有一个值,但至少其中一个应为null。
我试图找出上面的Linq语法,有没有办法写一个where语句但忽略where语句,如果要比较的列表是null?
基本上我正在寻找一种只使用LINQ编写上述内容的方法。
我不能使用Intersect或Except,因为它介于两种不同类型之间
答案 0 :(得分:3)
var result = properties
.Where(p => !(Except ?? Enumerable.Empty<String>()).Any(s => s == p.Name))
.Where(p => Only == null || Only.Any(s => s == p.Name))
.ToArray();
答案 1 :(得分:2)
我建议您根本不管理该方法中的过滤。相反,你可以这样做:
public static string UpdateCommand<T>(Func<IEnumerable<PropertyInfo>, IEnumerable<PropertyInfo>> filterFunc = null)
{
IEnumerable<PropertyInfo> properties = typeof(T).GetProperties();
if (filterFunc != null)
properties = filterFunc(properties);
...
}
像这样使用:
UpdateCommand(pis => pis.Where(pi => ...))
答案 2 :(得分:2)
最近在一篇关于可能的C#6.0功能(第7项)的文章中讨论了这类事情here 。如果没有一些解决办法,目前还不是很有可能,例如上一个答案所示。