Создать Funcдинамично - PullRequest
       28

Создать Funcдинамично

3 голосов
/ 22 апреля 2019

Похожие темы:

Создать Expression<Func<T, TKey>> динамически

Я искал в интернете, но все примеры объясняют 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 ]

2 голосов
/ 27 апреля 2019

Учитывая определение абстрактного класса, вам нужно будет включить ключ, являющийся частью общих аргументов, чтобы иметь возможность использовать его.

Простой пример передачи заказа по функции.

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);
0 голосов
/ 29 апреля 2019

Если вы хотите работать динамично, вы можете просто использовать 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();
}
...