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()
};
}