asp.net C#:获取委托中的属性名称

时间:2018-09-07 03:41:52

标签: c# asp.net properties delegates

我想通过传递委托而不是const字符串来提高可维护性。我所做的就是这样;

var propertyName = SprintMetrics.GetNameOf(metric => metric.Productivity); //Should be : "Productivity"

和:

public static string GetNameOf(Func<SprintMetrics, double> valueFunc)
{
    return valueFunc.GetMethodInfo().Name; //Result is : <Excute>b_40....
}

在调试过程中,我走路抛出了“ valueFunc”,而在任何地方都没有“生产力”。

有没有办法获得酒店的名称“生产力”?谢谢。


根据下面的“拒绝访问”的答案,可以通过以下两种方法来完成:

var p = nameof(SprintMetrics.Productivity); //"Productivity"

var metrics = new SprintMetrics();
p = nameof(metrics.Productivity); //"Productivity"

2 个答案:

答案 0 :(得分:2)

  

我走路时抛出了“ valueFunc”,而在任何地方都没有“生产力”。

这是因为valueFunc只是一个匿名函数,它返回Productivity属性的值,因为这是您定义委托的方式。

如果您想检查代表,则使用Expression代替:

public static string GetNameOf<T>(Expression<Func<SprintMetrics, T>> valueFunc)
{
    var expression = (MemberExpression)valueFunc.Body;
    return expression.Member.Name;
}

当然,您将需要添加错误处理(如果action.Body不是MemberExpression会怎样?如果它引用字段而不是属性呢?)。您可以在this answer

中看到更完整的示例

答案 1 :(得分:1)

您可以使用为此任务设计的C#关键字nameof:

var propertyName = nameof(metric.Productivity)

有关更多信息,请查看以下article

对于要从lambda表达式中提取属性名称的代码,可以使用以下方法(在这种情况下,无需输入Func参数):

public static string GetPropertyName<TProperty>(Expression<Func<TProperty>> propertyLambda)
{
    MemberExpression member = propertyLambda.Body as MemberExpression;
    if (member == null)
        throw new ArgumentException(string.Format(
            "Expression '{0}' refers to a method, not a property.",
            propertyLambda.ToString()));

    PropertyInfo propInfo = member.Member as PropertyInfo;
    if (propInfo == null)
        throw new ArgumentException(string.Format(
            "Expression '{0}' refers to a field, not a property.",
            propertyLambda.ToString()));
    return propInfo.Name;
}

您可以这样称呼:GetPropertyName(() => metric.Productivity)