【问题标题】:How to get names from expression property? [duplicate]如何从表达式属性中获取名称? [复制]
【发布时间】:2010-12-29 13:19:16
【问题描述】:

可能的重复:
Get method name and type using lambda expression
Can I use Expression<Func<T, bool>> and reliably see which properties are referenced in the Func<T, bool>?

嗨,

我想要一个方法,我可以像这样使用它

<% Html.TextBoxFor(x=>x.Property, Helper.GetAttributes<ViewModel>(x=>x.PropertyA)) %>

方法头是这样的

public static Dictionary<string, string> GetAttributeValues<T>(Expression<Func<T, object>> myParam)

但是我如何找出 PropertyA 的名称?在返回正确的属性之前,我需要做一些检查。 提前谢谢..

干杯

PS:感谢 driis post How to get names from expression property? 我找到了解决方案

是的

public static Dictionary<string, string> GetAttributeValues<T>(Expression<Func<T, object>> myParam)
{
    var item = myParam.Body as UnaryExpression;
    var operand = item.Operand as MemberExpression;
    Log.Debug(operand.Member.Name);
}

【问题讨论】:

  • 我认为它应该保持打开状态。 @GvS 的答案非常好,适用于在 asp.net mvc 应用程序中执行此类工作。我们标记为骗子的其他问题都没有他的答案。
  • 另见stackoverflow.com/questions/671968/…——如果你想要嵌套属性(即Thing1.Thing2 from o =&gt; o.Thing1.Thing2——见my attempt for an alternative

标签: c# .net lambda expression


【解决方案1】:

创建ModelMetadata 类的实例:

var data = ModelMetadata.FromLambdaExpression<T, object>(myParam);

现在您可以获得关于模型上使用的属性的所有信息:

var propName = data.PropertyName;
var label = data.DisplayName;

【讨论】:

    【解决方案2】:

    可能是:

    string propertyName = ((MemberExpression) myParam.Body).Member.Name;
    

    在生产代码中,您可能应该在强制转换之前检查表达式类型,如果传入的表达式不是 MemberExpression,则抛出适当的异常。

    【讨论】:

    • 感谢您的快速响应,但我收到错误 InvalidCastexception,无法从“System.Linq.Expressions.UnaryExpression”转换为“System.Ling.Expressions.MemberExpression”
    • 再次感谢,您对 memberexpression 的提示向我展示了解决此问题的正确方法 :-) 我已经更新了我的原始帖子
    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2011-05-20
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多