从表达式中获取模型类型
Getting model type from expression
我正在尝试使用反射来获取模型类型。到目前为止,我能够获得 属性 的类型。但是当我尝试使用表达式来获取模型类型时,我得到了那个 属性 的空引用。
表达是这样的,
model => model.property
在函数中,
//I'm passing model as a parameter
MemberExpression expBody = expression.Body as MemberExpression;
model.GetType().GetProperty(expBody.Member.Name.ToString()));
是否可以这样做?
MemberExpression expBody = expression.Body as MemberExpression;
expBody.Type.GetProperty(expBody.Member.Name.ToString()));
我试过了,但没用。
如果你想得到模型的类型,就这样做:
MemberExpression expbody = expression.Body as MemberExpression;
Type modelType = expbody.Expression.Type;
如果我们假设您的 expression
是一个 lambda 表达式,其 参数 是模型,则以下会产生您期望的行为:
Expression<Func<Model, string>> expression = model => model.SomeStringProperty;
Type modelType = expression.Parameters[0].Type;
MemberExpression expBody = expression.Body as MemberExpression;
PropertyInfo p = modelType.GetProperty(expBody.Member.Name);
Assert.NotNull(p);
请注意,modelType.GetProperty(expBody.Member.Name)
完全没有必要。最好从 MemberExpression
本身中提取成员以避免歧义:
PropertyInfo p = (PropertyInfo)expBody.Member;
我正在尝试使用反射来获取模型类型。到目前为止,我能够获得 属性 的类型。但是当我尝试使用表达式来获取模型类型时,我得到了那个 属性 的空引用。
表达是这样的,
model => model.property
在函数中,
//I'm passing model as a parameter
MemberExpression expBody = expression.Body as MemberExpression;
model.GetType().GetProperty(expBody.Member.Name.ToString()));
是否可以这样做?
MemberExpression expBody = expression.Body as MemberExpression;
expBody.Type.GetProperty(expBody.Member.Name.ToString()));
我试过了,但没用。
如果你想得到模型的类型,就这样做:
MemberExpression expbody = expression.Body as MemberExpression;
Type modelType = expbody.Expression.Type;
如果我们假设您的 expression
是一个 lambda 表达式,其 参数 是模型,则以下会产生您期望的行为:
Expression<Func<Model, string>> expression = model => model.SomeStringProperty;
Type modelType = expression.Parameters[0].Type;
MemberExpression expBody = expression.Body as MemberExpression;
PropertyInfo p = modelType.GetProperty(expBody.Member.Name);
Assert.NotNull(p);
请注意,modelType.GetProperty(expBody.Member.Name)
完全没有必要。最好从 MemberExpression
本身中提取成员以避免歧义:
PropertyInfo p = (PropertyInfo)expBody.Member;