Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExpressionTree rewrite-导航属性的MakeMemberAccess()_C#_.net 3.5_Expression Trees - Fatal编程技术网

C# ExpressionTree rewrite-导航属性的MakeMemberAccess()

C# ExpressionTree rewrite-导航属性的MakeMemberAccess(),c#,.net-3.5,expression-trees,C#,.net 3.5,Expression Trees,隐约地与某事物有关 注意:我使用的是ExpressionTree访问者的一个派生版本,如前所述 在我的VisitMemberAccess方法中,我当前使用以下内容创建MemberExpressions: // `mapping` is a class used to map EntityA's members to EntityB's members return Expression.MakeMemberAccess(Visit(m.Expression), mapping.TargetMem

隐约地与某事物有关

注意:我使用的是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;C#倾向于获得更好/更快的答案,所以我已经手工转换了。如果我犯了愚蠢的打字错误,请告诉我/etc

我认为将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);

我刚刚发现-看起来它包含了我所需要的-需要离开并考虑进去。将更新。-1我完全支持建设性的批评并被纠正,但是
“我认为将C代码翻译成英语可能会有帮助”
对我来说似乎更像是嘲弄…也许我误读了你的陈述?我称之为它的原因是什么“导航属性”是因为这就是我正在使用的ORM中所指的内容……我并不是说它是在模仿。它看起来好像你没有意识到你必须使用
MakeMemberAccess()
两次,因为您要创建的表达式中有两个属性访问。我知道您知道表达式的作用。但我认为,通过将C#翻译成英语,停下来思考它的实际含义是很有用的。我没有对命名进行评论,所以我不确定您为什么提到它。你是对的,我没有意识到需要多次调用
MakeMemberExpression
,直到我阅读了我在上面评论中链接的问题的答案。我想我现在理解了上述声明的上下文。请随意进行小编辑,我将删除-1。感谢您的回答