使用通用属性名处理lambda表达式

时间:2016-02-05 11:05:10

标签: c# generics episerver

使用EPiServer查找并尝试为其构建通用的facet功能,以简化管理应启用哪个方面。我想构建两个通用方法,一个用于添加活动过滤器以执行命中搜索,另一个用于执行剩余的可用构面过滤器。

第一种方法将执行以下操作(品牌过滤器的特定代码):

var brandFilter = client.BuildFilter<FashionProduct>();
foreach (var facet in SelectedGroup.Facets.Where(x => x.Selected))
{
    brandFilter =  brandFilter.Or(x => x.Brand.Match(facet.Key));
}
query = query.Filter(brandFilter);

我希望能够以通用方式调用它,因此我可以将可用方面基于一些简单的字符串或对象列表。像这样:

query = AddFilterFacet<FashionProduct>(query, "Brand", SelectedGroup.Facets)

因此,该方法将采用要过滤的对象类型,附加过滤器的查询,要过滤的属性的名称以及要添加的值列表。

第二种方法类似,但更多涉及执行以下操作:

facetQuery = facetQuery.TermsFacetFor(x => x.Brand)
...
var brandFacets = facetResult.TermsFacetFor(x => x.Brand).Terms;

是否可以构建此类功能?我最大的问号是如何将“品牌”输入字符串翻译为x =&gt;中的品牌属性。 x.Brand

private void AddFilterFacet<T>(IClient client, ref ITypeSearch<T> query, string propertyName, List<FacetOption> facets)
{
    var filter = client.BuildFilter<T>();
    foreach (var facet in facets)
    {
        filter = filter.Or(x => x.????.Match(facet.Key));
    }
    query = query.Filter(filter);
}

.Or方法需要

System.Linq.Expressions.Expression<Func<T, Find.Api.Querying.Filter>>

所以也许可以使用某些东西对它进行适当的通用调用

1 个答案:

答案 0 :(得分:0)

绝对可以创建通用的lambda表达式,这并不容易,需要大量的反射代码。

我有一段时间没有这样做,但是如果你看一下我之前为类似的东西创建的代码(Generic lambda表达式),它会有所帮助。我相信有经验的人会尽快帮助你。

Decimal precision attribute&lt; - 看看这个答案是否有代码可以自动从类中的属性生成modelBuilder.Entity<CLASS>().Property(OBJECT=> OBJECT.PROPERTY).HasPrecision(12, 10)

相关问题