我目前在自定义类型上使用反射功能时遇到问题。我有一个带有以下签名的方法:
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(...)
表达式?
答案 0 :(得分:2)
因为两个表达式都需要返回TValue
。在您的情况下,有一个表达式返回Guid
,而一个表达式返回Guid?
。由于您可以将结构隐式转换为可为空的版本,因此TValue
可以是Guid?
,并在返回Guid
的属性选择器上应用隐式转换。