如何从Expression <func <tsource,tsourcemember =“”>&gt;转换?到Func <tsource,bool =“”>条件

时间:2017-12-05 20:41:17

标签: c# lambda linq-expressions

我正在尝试转换

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;
}

关于如何将这些东西放在一起的任何指针或教程将不胜感激。我似乎总是在与表达树斗争。

1 个答案:

答案 0 :(得分:2)

您可能正在寻找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());
    }