C# 获取对象属性的值和名称

C# 获取对象属性的值和名称,c#,expression-trees,C#,Expression Trees,我正在尝试基于来自另一个对象的属性构建一些对象。我需要构建的对象类是 public class Data { public string Attribute { get; set; } public string Value{ get; set; } } 属性将是属性的名称(以及值及其值) 所以我尝试使用表达式树来创建一个方法,我可以使用它来避免对属性进行硬编码 到目前为止,我是根据我在网上读到的几篇文章来研究这两种方法的 public static string GetNam

我正在尝试基于来自另一个对象的属性构建一些对象。我需要构建的对象类是

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
    };
}
我很确定这条信息应该让错误变得明显,但这不是给我的

更新:

我这么说

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

        //...

}

必须是成员,而不是成员。表达式

    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
        };
    }
publicstaticdatabuilddata(表达式e,appDetailCategory)
{
var member=(MemberExpression)e.Body;
var name=member.member.name;
var value=Expression.Lambda(member.Compile());
返回新数据
{
属性=名称,
价值=价值
};
}

您的问题似乎在于
PubID
的类型不是字符串。您有两个选项,要么更改
数据
以将值存储为
对象
,要么对从属性返回的值调用
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()
    };
}
公共静态数据构建数据(表达式e)
{
var member=(MemberExpression)e.Body;
var name=member.member.name;
Func getPropertyValue=e.Compile();
对象值=getPropertyValue();
返回新数据
{
属性=名称,
Value=Value.ToString()
};
}

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

看起来
strExpr
表示的方法没有Lambda.compile()所期望的
string
返回类型。您是否可以约束
e
参数的通用
T
类型,或替换Lambda中的
。使用
编译?您不希望硬编码。但是,如何读取您的对象并将其转换为json字符串并将其转换回动态对象呢?谢谢@mikeofst,我已经更新了如何调用它,我希望直接返回字符串,因为该属性是字符串。我明白您的观点@theinsaneone,谢谢。问题是,我需要映射其他不适合此数据类型的属性,并且可以直接映射,因此对于它们来说,将是来回的,不是吗?异常的堆栈跟踪很可能会使回答您的问题更容易。
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()
    };
}