Создать метод, который создает динамическое выражение - PullRequest
0 голосов
/ 05 октября 2018

Я хочу создать метод, который возвращает словарь, как показано ниже.Но я хочу быть универсальный метод, который paremerters ara EntityType и columnNameList.Я хочу вызвать вот так:

Мой метод вызова:

CreateColumnMap<Student>(new List<string>{"Name","Surname","Age"});

Мое возвращаемое значение

 var columnsMap = new Dictionary<string, Expression<Func<Student, object>>>()
                    {
                      ["Name"] = v => v.Name,
                      ["Surname"] = v => v.Surname,
                      ["Age"] = v => v.Age
                    };

Student.cs

public class Student
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public string Age { get; set; }
    public string SchoolName { get; set; }
}

Я начал работать, как показано ниже.Но я не могу завершить.Как я могу завершить "???"часть.

public Dictionary<string, Expression<Func<T, object>>> CreateColumnMap<T>(List<string> columNameList)
{
    var dictionary = new Dictionary<string, Expression<Func<T, object>>>();
    foreach (var columnName in columNameList)
    {
        //??????
        dictionary.Add(); //????????????????????
        //??????
    }
    return dictionary;
}

1 Ответ

0 голосов
/ 05 октября 2018

Ссылка Создание деревьев выражений с помощью API

Используйте класс Expression и его статические фабричные методы, чтобы вручную построить желаемое выражение на основе предоставленного имени члена из универсального аргумента.type.

Например, следующее использует фабричные методы Parameter и Property, чтобы вручную построить узлы дерева выражений для лямбда-выражения v => v.PropertyName

Expression<Func<TModel, object>> GetPropertyExpression<TModel>(string propertyName) {
    // Manually build the expression tree for 
    // the lambda expression v => v.PropertyName.

    // (TModel v) =>
    var parameter = Expression.Parameter(typeof(TModel), "v");
    // (TModel v) => v.PropertyName
    var property = Expression.Property(parameter, propertyName);

    var expression = Expression.Lambda<Func<TModel, object>>(property, parameter);
    return expression;
}

Затем можноприменить выше

public Dictionary<string, Expression<Func<T, object>>> CreateColumnMap<T>(List<string> columNameList) {
    var dictionary = new Dictionary<string, Expression<Func<T, object>>>();
    foreach (var columnName in columNameList) {            
        dictionary[columnName] = GetPropertyExpression<T>(columnName);
    }
    return dictionary;
}
...