获取对象的属性值和名称

时间:2014-08-12 11:31:53

标签: c# expression-trees

我试图根据来自另一个对象的属性构建一些对象。我需要构建的对象类是

public class Data
{
    public string Attribute { get; set; }
    public string Value{ get; set; }
}

该属性将是属性的名称(及其值的值)

所以我试图使用表达式树来制作一个方法,我可以使用它来避免硬编码属性

到目前为止,基于我在网上阅读的几篇帖子,我来到了这几种方法

public static string GetName<T>(Expression<Func<T>> e)
{
    var member = (MemberExpression)e.Body;
    return member.Member.Name;
}

public static Data BuildData<T>(Expression<Func<T>> e, appDetailCategory category)
{
    var member = (MemberExpression)e.Body;
    Expression strExpr = member.Expression;

    var name = member.Member.Name;
    var value = Expression.Lambda<Func<string>>(strExpr).Compile()();

    return new Data
    {
        Attribute = name,
        Value = value
    };
}

但我尝试设置该值的行引发了一个异常:

Expression of type 'AutomapperTest.Program+DecisionRequest' cannot be used for return type 'System.String'

我很确定这条消息应该会让错误明显,但不适合我

更新:

我这样称呼

private static Data[] GetApplicatonDetailsFromRequest(DecisionRequest request)
{
        BuildData(() => request.PubID)

        //...

}

2 个答案:

答案 0 :(得分:1)

必须是成员,而不是 member.Expression

    public static Data BuildData<T>(Expression<Func<T>> e, appDetailCategory category)
    {
        var member = (MemberExpression)e.Body;

        var name = member.Member.Name;
        var value = Expression.Lambda<Func<string>>(member).Compile()();

        return new Data
        {
            Attribute = name,
            Value = value
        };
    }

答案 1 :(得分:0)

看起来您的问题是PubID的类型不是字符串。您有两个选项,可以更改Data以将值存储为object,也可以对属性返回的值调用ToString并存储它。例如:

public static Data BuildData<T>(Expression<Func<T>> e)
{
    var member = (MemberExpression)e.Body;
    var name = member.Member.Name;

    Func<T> getPropertyValue=e.Compile();
    object value = getPropertyValue();

    return new Data
    {
        Attribute = name,
        Value = value.ToString()
    };
}

请注意,要获取该值,您只需编译Func表达式。