我的最终目标是制作<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