Fil*_*erg 2 c# generics lambda
假设你有一个通用类,它有一个 List<T> Items;
现在想想这个基本的lambda表达式:
var result = Items.FindAll(x => x.Name = "Filip");
只有当我们知道属性时T,这才会起作用,当它是通用类型时,你不会这样做.
因此,我想使用Reflection获取属性,如下所示:
PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public);
并以某种方式将其与上述Lambda表达式组合在一起,以便它搜索Type的所有公共属性并查看它是否包含"Filip",此时我不在乎属性名是否为Name.
这可能吗?
Ada*_*son 11
var result = Items.FindAll(x =>
properties.Any(p => p.PropertyType == typeof(string) &&
p.GetValue(x, null) == "Filip"));
Run Code Online (Sandbox Code Playgroud)
显然,这是一个简单的,乐观的字符串比较(string.Compare例如,你可能想要使用),但这应该让这个想法变得清晰.
编辑
dtb在使用表达式树时提出了一个很好的建议.你可以用这样更快的方式完成你所追求的目标:
public static class PropertyScanner
{
static Func<TType, bool> CreatePredicate<TType, TValue>(TValue value, IEqualityComparer<TValue> comparer)
{
var arg = Expression.Parameter(typeof(TType), "arg");
Expression body = null;
Expression<Func<TValue, TValue, bool>> compare = (val1, val2) => comparer.Equals(val1, val2);
foreach (PropertyInfo property in typeof(TType).GetProperties(BindingFlags.Public))
{
if (property.PropertyType == typeof(TValue) || typeof(TValue).IsAssignableFrom(property.PropertyType))
{
Expression prop = Expression.Equal(Expression.Invoke(compare, new Expression[]
{
Expression.Constant(value),
Expression.Property(arg, property.Name)
}),
Expression.Constant(0));
if (body == null)
{
body = prop;
}
else
{
body = Expression.OrElse(body, prop);
}
}
}
return Expression.Lambda<Func<TType, bool>>(body, arg).Compile();
}
public static IEnumerable<TType> ScanProperties<TType, TValue>(this IEnumerable<TType> source, TValue value)
{
return ScanProperties<TType, TValue>(source, value, EqualityComparer<TValue>.Default);
}
public static IEnumerable<TType> ScanProperties<TType, TValue>(this IEnumerable<TType> source, TValue value, IEqualityComparer<TValue> comparer)
{
return source.Where(CreatePredicate<TType, TValue>(value, comparer));
}
}
Run Code Online (Sandbox Code Playgroud)
这将允许您执行以下操作:
var result = Items.ScanProperties("Filip").ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |