具有动态返回类型的表达式(动态关键字)

时间:2018-06-15 22:56:54

标签: c# lambda linq-expressions

我的最终目标是制作<section class='module'> <div class='header'>Hello</div> <div class='content'> <% if (site.categories.length){var limit=0; %> <ul class="list"> <!--<% "EJS code here" %>--> <li> <a class="flat-box" href="<%= url_for(item.path) %>"> <div class='name'> <!--<%= item.name %>--> </div> <div class='count'> <!--<%= item.posts.length %>--> </div> </a> </li> </ul> </div> </section>的通用版本,它采用字符串参数和可选的排序方向。像这样的东西:

IQueryable<T>.OrderBy()

(用例将是一个在列表中排序的字段中传递的网站。)

为此,我一直试图想出一种创建以下表达式的方法:

return myList.OrderBy("Property1");
return myList.Orderby("Property1", SortOrder.Descending);

我在StackOverflow中发现了一些可以帮助我的地方,他们让我非常接近(this one in particular)。但它并没有让我一路走来。具体而言,我一直在变得可怕 类型系统的表达.Int64&#39;不能用于返回类型&#39; System.Object&#39; 的值类型。我以为我可以在这里回归obj => obj.PropertyName ,但这似乎已经失败了。我可以做一个dynamic,但这似乎没必要。

我生成属性选择器的代码如下:

Convert

然后在扩展方法实现中使用:

public static Expression<Func<T, dynamic>> GeneratePropertySelector<T>(string propertyName)
{
    var objectType = typeof(T);
    var property = objectType.GetProperty(propertyName);

    ParameterExpression arg = Expression.Parameter(objectType, "obj");
    MemberExpression propertyExpression = Expression.Property(arg, propertyName);

    // Here is the line that dies
    var selectorExpression = Expression.Lambda<Func<T, dynamic>>(propertyExpression, new ParameterExpression[] { arg });

    return selectorExpression;
}

对于var ordered = myList.OrderBy(GeneratePropertySelector("Property1")); 属性,这很好用;对于string属性,错误。

有谁知道怎么解决这个问题?我本以为int会在这里有所帮助,但我不知所措。鉴于我的用例,我试图避免这样的事情:

dynamic

0 个答案:

没有答案