动态创建Func <t,tkey =“”>

时间:2019-04-22 11:03:47

标签: func dynamic-linq c#-7.0

相关主题:

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属性对列表进行排序?

谢谢

2 个答案:

答案 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,但也很容易成为intGuid等。

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