我试图根据来自另一个对象的属性构建一些对象。我需要构建的对象类是
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)
//...
}
答案 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
表达式。