C# 通过MemberExpression获取属性类型

C# 通过MemberExpression获取属性类型,c#,c#-4.0,properties,expression,C#,C# 4.0,Properties,Expression,我问类似的问题 ,假定此类型: public class Product { public string Name { get; set; } public string Title { get; set; } public string Category { get; set; } public bool IsAllowed { get; set; } } 而这个使用MemberExpression: public class HelperClass<T> { p

我问类似的问题 ,假定此类型:

 public class Product {

public string Name { get; set; }
public string Title { get; set; }
public string Category { get; set; }
public bool IsAllowed { get; set; }

}
而这个使用
MemberExpression

public class HelperClass<T> {

    public static void Property<TProp>(Expression<Func<T, TProp>> expression) {

        var body = expression.Body as MemberExpression;

        if(body == null) throw new ArgumentException("'expression' should be a member expression");

        string propName = body.Member.Name;
        Type proptype = null;

    }

}
公共类帮助类{
公共静态void属性(表达式){
var body=expression.body作为MemberExpression;
if(body==null)抛出新的ArgumentException(“'expression'应该是成员表达式”);
字符串propName=body.Member.Name;
类型proptype=null;
}
}
我是这样使用它的:

HelperClass<Product>.Property(p => p.IsAllowed);
HelperClass.Property(p=>p.IsAllowed);
HelperClass
中,我只需要属性名(在本例中
是允许的
)和属性类型(在本例中
Boolean
),这样我就可以得到属性名,但无法得到属性类型。我在调试中看到的属性类型如下图所示:


那么,您对获取属性类型的建议是什么呢?

尝试将
body.Member
转换为
PropertyInfo

public class HelperClass<T>
{
    public static void Property<TProp>(Expression<Func<T, TProp>> expression)
    {
        var body = expression.Body as MemberExpression;

        if (body == null)
        {
            throw new ArgumentException("'expression' should be a member expression");
        }

        var propertyInfo = (PropertyInfo)body.Member;

        var propertyType = propertyInfo.PropertyType;
        var propertyName = propertyInfo.Name;
    }
}
公共类帮助类
{
公共静态void属性(表达式)
{
var body=expression.body作为MemberExpression;
if(body==null)
{
抛出新ArgumentException(“'expression'应该是成员表达式”);
}
var propertyInfo=(propertyInfo)body.Member;
var propertyType=propertyInfo.propertyType;
var propertyName=propertyInfo.Name;
}
}