【发布时间】:2025-12-09 23:10:01
【问题描述】:
我有一个扩展方法来获取属性名作为字符串:
public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
{
return ((MemberExpression)propertyId.Body).Member.Name;
}
现在我有另一种方法,期望传入这种属性lamba表达式的列表(参数)。 我希望这个新方法可以重用第一种方法,但不知道如何通过它
public string Test<T>(params Expression<Func<T, object>>[] ps)
{
foreach (var p in ps)
{
var howToCodeThis = p.GetPropertyName(dummy => dummy);
预期用途:
var result = Test<Something>(request.Sorting
, x => x.prop1
, x => x.prop2
, x => x.prop3
);
更新: 一旦我更改了 GetPropertyName 以适应 UnaryExpression,Backs 的答案就起作用了:
public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
{
if (propertyId.Body is MemberExpression)
return ((MemberExpression)propertyId.Body).Member.Name;
if (propertyId.Body is UnaryExpression)
{
var op = ((UnaryExpression)propertyId.Body).Operand;
return ((MemberExpression)op).Member.Name;
}
throw new NotImplementedException(string.Format("GetPropertyName - {0}", propertyId.Body.GetType().FullName));
}
【问题讨论】:
-
不久前我问了一个非常相似的问题:*.com/questions/30734899/…
-
我对你的问题投了赞成票。我真的很讨厌人们无缘无故地否决一个问题。
-
谢谢。如果有解释,投反对票会很有帮助,我同意你的看法。
标签: c# lambda expression-trees