Неясно связано с предыдущим вопросом< /эм>
Примечание. Я использую производную версию посетителя ExpressionTree, как описано здесь
В моем методе VisitMemberAccess
я в настоящее время создаю MemberExpressions, используя что-то вроде:
// `mapping` is a class used to map EntityA's members to EntityB's members
return Expression.MakeMemberAccess(Visit(m.Expression), mapping.TargetMemberInfo);
По большей части это работает.
Учитывая некоторые тестовые классы...
public class EntityA
{
public long Id { get; set; }
public string Name { get; set; }
}
public class EntityB
{
public long MyId {get; set; }
public string MyName { get; set; }
}
Код правильно сопоставит (EntityA x) => x.Id
с (EntityB x) => x.MyId
, что прекрасно и прекрасно работает. Моя проблема возникает, когда вы вводите свойства навигации:
public class EntityB
{
public long MyId {get; set; }
public EntityBDetails NavigationProperty { get; set; }
}
public class EntityBDetails
{
public string MyName { get; set; }
}
Учитывая приведенный выше тривиальный случай, я бы хотел, чтобы (EntityA x) x => x.Name
отображалось на (EntityB x) x => x.NavigationProperty.Name
. И в этом проблема, я понятия не имею, что предоставить MakeMemberAccess
, чтобы эта работа работала... Я могу сравнить mapping.TargetMemberInfo.DeclaringType == mapping.TargetMemberInfo.ReflectedType
, чтобы определить, задействовано ли свойство навигации, но как мне создать необходимое MemberExpression?
Заранее спасибо!
Примечание: кодовая база, над которой я работаю, — VB; С# имеет тенденцию получать лучшие/быстрые ответы на SO, поэтому я конвертировал вручную. Дайте мне знать, если я допустил глупую опечатку/и т. д.