如何实现以下c#表达式树用法?

如何实现以下c#表达式树用法?,c#,expression,expression-trees,C#,Expression,Expression Trees,假设我有以下课程: public class Person { public string Name { get; set; } public int Age { get; set; } } 我如何或者是否有可能使用表达式树实现一个方法,使其看起来像下面这样 Dictionary<string, object> someDictionary = GetDictionary(); Person person = new Person(); person.Set(som

假设我有以下课程:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
我如何或者是否有可能使用表达式树实现一个方法,使其看起来像下面这样

Dictionary<string, object> someDictionary = GetDictionary();
Person person = new Person();
person.Set(someDictionary, "someKey", p => p.Name, value => Transform(value));
但对于如何实施它却没有太多线索。
欢迎任何帮助。谢谢

我有如下几点:

public static void Set<TValue>(this Person person, IDictionary<string, object> dictionary, string key, Expression<Func<Person, TValue>> selector, Expression<Func<object, TValue>> transformer)
{
    if (!dictionary.TryGetValue(key, out var value))
    {
        return;
    }

    // more logic to manipulate 'value'...

    var parameterExpression = (ParameterExpression) ((MemberExpression) selector.Body).Expression;
    var delegateExpression = Expression.Lambda<Action<Person>>(
        Expression.Assign(selector.Body, transformer.Body), parameterExpression
    );

    delegateExpression.Compile()(person);
}
公共静态无效集(此人、IDictionary字典、字符串键、表达式选择器、表达式转换器)
{
if(!dictionary.TryGetValue(key,out var value))
{
返回;
}
//更多操作“值”的逻辑。。。
var parameterExpression=(parameterExpression)((MemberExpression)selector.Body.Expression;
var delegateExpression=Expression.Lambda(
Expression.Assign(selector.Body、transformer.Body)、parameterExpression
);
delegateExpression.Compile()(person);
}

但是我不知道如何将
传递给
变压器

,我想我已经得到了答案。有人能告诉我这是否合法吗

public static void Set<TValue>(this Person person, IDictionary<string, object> dictionary, string key, Expression<Func<Person, TValue>> selector, Expression<Func<object, TValue>> transformer)
{
    if (!dictionary.TryGetValue(key, out var value))
    {
        return;
    }

    var parameterExpression = selector.Parameters.Concat(transformer.Parameters);
    var delegateExpression = Expression.Lambda<Action<Person, object>>(
        Expression.Assign(selector.Body, transformer.Body), parameterExpression
    );

    delegateExpression.Compile()(person, value);
}
公共静态无效集(此人、IDictionary字典、字符串键、表达式选择器、表达式转换器)
{
if(!dictionary.TryGetValue(key,out var value))
{
返回;
}
var parameterExpression=selector.Parameters.Concat(transformer.Parameters);
var delegateExpression=Expression.Lambda(
Expression.Assign(selector.Body、transformer.Body)、parameterExpression
);
delegateExpression.Compile()(person,value);
}

我不确定您想做什么,但您可能想看看LinqKit为什么要求参数是表达式?既然您有
p=>p.Name
作为一个表达式,为什么不能直接使用
(p,value)=>p.Name=Transform(value)
public static void Set<TValue>(this Person person, IDictionary<string, object> dictionary, string key, Expression<Func<Person, TValue>> selector, Expression<Func<object, TValue>> transformer)
{
    if (!dictionary.TryGetValue(key, out var value))
    {
        return;
    }

    var parameterExpression = selector.Parameters.Concat(transformer.Parameters);
    var delegateExpression = Expression.Lambda<Action<Person, object>>(
        Expression.Assign(selector.Body, transformer.Body), parameterExpression
    );

    delegateExpression.Compile()(person, value);
}