相关主题:
Create Expression<Func<T, TKey>>
dynamically
我在互联网上进行搜索,但所有示例都解释了Expression<Func<
。如何从Func<T, TKey>
动态创建T
?
谢谢
编辑1)
我的代码中的T
类型在运行时确定,例如,我想用Name
对列表进行排序。现在如何创建它:Func<T, TKey> = o=>o.Name;
编辑2)
请考虑以下问题:
public abstract class MyClass<T> where T : class
{
public virtual List<T> GetAll(Expression<Func<T, bool>> exp, string orderByProperty)
{
repository.Get(exp).OrderBy(?);
}
}
问题是创建一个Func<T, TKey>
参数供OrderBy
使用。如何使用Name
属性对列表进行排序?
谢谢
答案 0 :(得分:2)
鉴于抽象类的定义,您需要将键包含在泛型参数中,以便能够使用它。
通过函数传递订单的简单示例。
public abstract class MyClass<T, TKey> where T : class {
public virtual List<T> GetAll(
Expression<Func<T, bool>> exp,
Func<T, TKey> keySelector = null
) {
var query = repository.Get(exp);
if(orderBy != null) {
return query.OrderBy(keySelector).ToList();
return query.ToList();
}
}
然后您可以使用默认键类型的类的派生版本
例如,以下代码使用string
,但也很容易成为int
,Guid
等。
public abstract class MyClass<T> : MyClass<T, string> where T : class {
}
但是最重要的是,您需要按类型知道订单才能使用它。
...GetAll(_ => _.SomeProperty == someValue, o => o.Name);
答案 1 :(得分:0)
如果您想一直保持动态,可以使用System.Linq.Dynamic.Core
class SomeClass
{
public int SomeValue { get; set; }
public int X { get; set; }
}
public class MyClass
{
public static List<T> GetAll<T>(string predicate, string orderByProperty)
{
var repository = new List<SomeClass>() {
new SomeClass{SomeValue = 1, X = 12 },
new SomeClass{SomeValue = 2, X = 99 },
new SomeClass{SomeValue = 3, X = 55 }
}.AsQueryable();
return repository.Where(predicate).OrderBy(orderByProperty).ToDynamicList<T>();
}
}
void Main()
{
var result = MyClass.GetAll<SomeClass>("SomeValue > 1", "X");
result.Dump();
}