我尝试创建一个比较原始值和更新后值的函数,并将原始值设置为更新后的值(如果不同)。该函数的作用更多,因此我简化了对主题的讨论:
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地图获取到最近的地标(购物中心,医院和机场等)的距离 - javaImprove 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…