如何从 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());
    }