如何从 Expression<Func<TSource, TSourceMember>> 转换为 Func<TSource, bool> 条件
How can I convert from Expression<Func<TSource, TSourceMember>> to Func<TSource, bool> condition
我正在尝试从
转换
x => x.SomeProperty
到
x => x.SomeProperty is ISomeInterface
在符合以下签名的方法中:
Func<TSource, bool> Convert(Expression<Func<TSource, TSourceMember>> source);
其中 SomeProperty 可能是一个集合或单个对象。有人可以帮忙吗?
我发现很难弄清楚这些是什么类型的表达式。我认为第一个是 MemberExpression,第二个是 UnaryExpression。
我很乐意移动
x.SomeProperty is ISomeInterface
将逻辑放入方法中,如果这样可以使事情变得更容易的话。
bool IsSomeInterface(object obj)
{
return obj is ISomeInterface;
}
任何关于如何将这些东西放在一起的指示或教程将不胜感激。我似乎总是在与表达式树作斗争。
您可能正在寻找 Expression.TypeIs(...)
。试试这个:
Func<TSource, bool> Convert<TSource, TSourceMember>(Expression<Func<TSource, TSourceMember>> source)
{
return (Func<TSource, bool>)(Expression.Lambda<Func<TSource, bool>>(Expression.TypeIs(source.Body, typeof(ISomeInterface)), source.Parameters).Compile());
}
我正在尝试从
转换x => x.SomeProperty
到
x => x.SomeProperty is ISomeInterface
在符合以下签名的方法中:
Func<TSource, bool> Convert(Expression<Func<TSource, TSourceMember>> source);
其中 SomeProperty 可能是一个集合或单个对象。有人可以帮忙吗?
我发现很难弄清楚这些是什么类型的表达式。我认为第一个是 MemberExpression,第二个是 UnaryExpression。
我很乐意移动
x.SomeProperty is ISomeInterface
将逻辑放入方法中,如果这样可以使事情变得更容易的话。
bool IsSomeInterface(object obj)
{
return obj is ISomeInterface;
}
任何关于如何将这些东西放在一起的指示或教程将不胜感激。我似乎总是在与表达式树作斗争。
您可能正在寻找 Expression.TypeIs(...)
。试试这个:
Func<TSource, bool> Convert<TSource, TSourceMember>(Expression<Func<TSource, TSourceMember>> source)
{
return (Func<TSource, bool>)(Expression.Lambda<Func<TSource, bool>>(Expression.TypeIs(source.Body, typeof(ISomeInterface)), source.Parameters).Compile());
}