MemberExpression被标记为Convert(...)调用而不是MemberExpression

时间:2019-08-19 18:24:50

标签: c# reflection

我目前在自定义类型上使用反射功能时遇到问题。我有一个带有以下签名的方法:

protected static bool ReplacePropertyValue<TTargetResource, TValue>(TEntity entity, TResourcePatch resourcePatch, Expression<Func<TResource, TTargetResource>> sourceResourcePropertyExpression, Expression<Func<TTargetResource, TValue>> sourcePropertyExpression, Expression<Func<TEntity, TValue>> targetPropertyExpression)

其中TEntity是我要更新的数据库实体。 其中TTargetResource是我要从中获取新值的补丁文档的资源。 其中TValue是属性的类型,我希望在实体中设置新值。

resourcePatch包含我要应用于entity的所有修补程序说明。 sourceResourcePropertyExpression是具有新值/更改值的资源的表达式。 sourcePropertyExpression是具有新的/更改的值的资源属性的表达式。 targetPropertyExpression是指向属性的表达式,该属性应具有新的/更改的值。

但是,我遇到的问题是targetPropertyExpression不是MemberExpression。下面是该方法的调用

 ReplacePropertyValue(theEntity, resourcePatch, team => team.ParentTeam, pt => pt.Id, team => team.TeamParentTeamId)

但是,最后一个参数显示为{team => Convert(team.TeamParentTeamId)},但我不明白为什么。 TeamParentTeamId的类型为Guid。 与Guid?类型的另一个属性一起使用时,它将按预期工作。

谁能告诉我为什么第一个(Guid)是Convert(...)表达式?

1 个答案:

答案 0 :(得分:2)

因为两个表达式都需要返回TValue。在您的情况下,有一个表达式返回Guid,而一个表达式返回Guid?。由于您可以将结构隐式转换为可为空的版本,因此TValue可以是Guid?,并在返回Guid的属性选择器上应用隐式转换。