所以,让我们说我有以下课程:
public class Model {
public AnotherModel InnerModel {
get;
set;
}
}
public class AnotherModel {
public String Value{
get;
set;
}
}
现在我有以下功能:
public static void Foo<T, U>(Expression<Func<T, U>> func) {
// Get the property info from func
}
我现在想做的是:
Foo<Model, String>(o => o.InnerModel.Value)
问题出现了:
我知道您可以通过执行以下操作从表达式func中获取PropertyInfo:
PropertyInfo propertyInfo = (PropertyInfo)((MemberExpression)func.Body).Member;
这将获得Value属性的PropertyInfo。但是,我还想获得有关parent属性的信息,即InnerModel属性。
到目前为止,我所知道的是我可以做到以下几点:
((MemberExpression)func.Body).Expression
获取父属性的信息。但是,似乎无法从Expression本身中提取PropertyInfo。
是否有某种方法可以实际检索Expression的PropertyInfo?
编辑: 澄清一下,这可能是一种尝试它的坏方法,但是这里有: 我无法使用EntityFramework,只是为了确保理解它。
我需要通过API与数据库进行通信。
这个数据库得到了通常的关系: 表螺纹 用户ID - &gt; Users.UserID
现在提取到模型。按照上面的例子:
class Thread {
[Reference(USER_USERID)]
[TableKey(THREAD_USERID)]
public User user {
get;set;
}
}
class User {
[TableKey(USER_USERID)]
public int UserId {
get;set;
}
}
现在我想对此进行查询。所以我想&#34;嘿,让我们使用表达式来简化最终用户如何提问的东西,是的。&#34;
所以,我们可以做类似EqualTo(o =&gt; o.user.UserId,1);
但是,由于TableKey属性与引用键不同,我需要首先从数据库中获取ThreadI表中的userId,然后使用该Id开始向User表询问具有该id的信息。
也许这澄清了所有这一切的目的,或者也许不是。
答案 0 :(得分:4)
正如您已经确定的那样,表达式的主体是一个MemberExpression。我们需要查看MemberExpression的两个属性。
第一个是会员财产。这个被调用的MemberInfo。在您的示例中,这是Value属性。我们需要看的第二个属性是Expression属性。这是调用成员表达式的内容。在您的示例中,这是{o.InnerModel}。
{o.InnerModel}是另一个MemberExpression。成员是InnerModel,表达式是o。
以下是获取MemberInfos链的一些代码
public static void Foo<T, U>(Expression<Func<T, U>> func)
{
var memberExp = func.Body as MemberExpression;
while (memberExp != null)
{
var memberInfo = memberExp.Member;
Console.WriteLine(memberInfo.Name);
memberExp = memberExp.Expression as MemberExpression;
}
}
当这样调用时:
Foo<Model, String>(o => o.InnerModel.Value);
它会输出:
此:
Foo<Assembly, int>(a => a.EntryPoint.DeclaringType.AssemblyQualifiedName.Length);
将输出: