如何获取Expression <Func <object >>目标对象设置值? - c#

我尝试创建一个比较原始值和更新后值的函数,并将原始值设置为更新后的值(如果不同)。该函数的作用更多,因此我简化了对主题的讨论:

public void Match<T>(Expression<Func<object>> original, Expression<Func<object>> updated)
{
    var mex = original.Body as MemberExpression;

    var funcOriginal = original.Compile();
    var funcUpdated = updated.Compile();

    var valueOriginal = funcOriginal();
    var valueUpdated = funcUpdated();

    if (valueOriginal != valueUpdated)
    {
       var info = mex.Member as PropertyInfo;
       var target = ???; //How to get the original.TestProperty here?

       info.SetValue(target, valueUpdated);
    }
}

我想这样称呼:

manager.Match<TestClass>(() => original.TestProperty, () => updated.TestProperty);

参考方案

成员信息的Expression属性表示从中获取该属性的变量。您只需要调用它即可将其评估为一个值。

public static void Match<T>(Expression<Func<T>> original, 
    Expression<Func<T>> updated)
{
    var mex = original.Body as MemberExpression;
    var valueOriginal = original.Compile()();
    var valueUpdated = updated.Compile()();

    if (!object.Equals(valueOriginal, valueUpdated))
    {
        var info = mex.Member as PropertyInfo;

        var target = Expression.Lambda(mex.Expression).Compile().DynamicInvoke();

        info.SetValue(target, valueUpdated);
    }
}

当然,如果此类型是值类型,那么您将通过调用此表达式创建的内容是该值的副本,并且您最终将对该副本进行变异,但是只要它是引用类型,您就可以复制参考,实际对象实际上将被突变。

您可以采取另一种完全不同的方法。您可以简单地创建一个表示将必须的值分配给该表达式的表达式,而不是尝试评估可以分配给该属性的变量。如果从值类型访问属性,该代码甚至将起作用,因为它实际上是在对变量进行突变,而不是获取该变量的值并对其进行突变。

public static void Match<T>(Expression<Func<T>> original, 
    Expression<Func<T>> updated)
{
    var mex = original.Body as MemberExpression;
    var valueOriginal = original.Compile()();
    var valueUpdated = updated.Compile()();

    if (!object.Equals(valueOriginal, valueUpdated))
    {
        var body = Expression.Assign(
            Expression.MakeMemberAccess(mex.Expression, mex.Member),
            updated.Body);

        Expression.Lambda<Action>(body).Compile().Invoke();
    }
}

尽管使方法通用,但实际上也没有将通用参数用作两个函数的结果类型。

将对象转换为List <object> - c#

我看过类似的问题,但没有什么合适的。我有一个碰巧包含列表的对象。我想把它变成我可以列举的东西。例如:object listObject; // contains a List<Something> List<object> list; list = listObject as List<object>; // list c…

休眠映射<键,设置<值>> - java

我有以下表格:@Entity @Table(name = "events") Event --id --name @Entity @Table(name = "state") State --id --name @Entity @Table(name = "action") Action --id …

如何使用BeautifulSoup在<tr>中捕获特定的<td> - python

尝试从nyc Wiki页面中的高中列表中获取所有高中名称。我已经写了足够多的脚本,可以让我获取包含在高中,学业和入学条件列表的表的<tr>标记中的所有信息-但是我如何才能缩小到我认为的范围内在td[0]内休息(会弹出KeyError)-只是学校的名称?到目前为止我写的代码:from bs4 import BeautifulSoup from ur…

使用Google地图获取到最近的地标(购物中心,医院和机场等)的距离 - java

Improve this question 我正在做一个项目,在印度的主要城市中,我有大约100000个地址(这是数据库中的表格)。我想知道是否可以获取到最近的地标(购物中心,医院和机场等)的距离。理想情况下,我希望将这些距离合并到父表中。一旦找到解决方法,我们就会有Java和Php编码器来完成它。任何指针都会有很大帮助。谢谢。 参考方案 (我可能会在这里说…

合并List <T>和List <Optional <T >> - java

鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…