假设我有以下类:
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。然而,我还想获取关于父属性InnerModel的信息。
目前我所知道的是可以执行以下操作:
((MemberExpression)func.Body).Expression
想要获取父属性的信息。然而,似乎无法从表达式本身中提取PropertyInfo。
有没有一种实际检索Expression的PropertyInfo的方法?
编辑: 为了澄清,可能是一种不好的尝试,但是这里有: 我不能使用EntityFramework来完成这个,只是为了确保这一点被理解。
有一个需要通过API与之通信的数据库。
此数据库具有常规关系,如以下方式: Table Thread UserID -> 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;
}
}
现在我想对此进行查询。所以我想:“嘿,使用表达式来简化最终用户询问的方式,好啊!”
因此,我们可以做一些像EqualTo(o => o.user.UserId,1)的事情。
然而,由于TableKey属性与参考键不同,我需要先从Thread表中获取userId,然后使用该Id开始向User表请求具有该id的信息。
也许这澄清了所有这些的目的,也可能没有。