gpt4 book ai didi

c# - ExpressionTree 重写 - 用于导航属性的 MakeMemberAccess()

转载 作者:行者123 更新时间:2023-11-30 19:20:04 30 4
gpt4 key购买 nike

模糊地与 previous question 相关

注意:我正在使用 ExpressionTree 访问者的派生,如 here 所解释的那样

在我的 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; C# 往往会在 SO 上获得更好/更快的答案,所以我已经手动转换了。如果我犯了愚蠢的打字错误/等,请告诉我

最佳答案

我认为将 C# 代码翻译成英语,然后将其翻译成表达式创建代码可能会有所帮助:

表达式 x.NavigationProperty.Name 实际上意味着“访问 x 上的属性 NavigationProperty 然后访问属性 Name 关于结果。现在,代码:

ParameterExpression x = …;
var navigationProperty = typeof(EntityB).GetProperty("NavigationProperty");
var name = typeof(EntityBDetails).GetProperty("Name");

var navigationPropertyAccess = Expression.MakeMemberAccess(x, navigationProperty);
var nameAccess = Expression.MakeMemberAccess(navigationPropertyAccess , name);

关于c# - ExpressionTree 重写 - 用于导航属性的 MakeMemberAccess(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7334668/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com