首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asp.net C#:获取委托中的属性名称

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

Stack Overflow用户
提问于 2018-09-07 03:41:52
回答 2查看 139关注 0票数 0

我希望通过传递委托而不是const字符串来增加可维护性。我所做的就是这样;

代码语言:javascript
复制
var propertyName = SprintMetrics.GetNameOf(metric => metric.Productivity); //Should be : "Productivity"

以及:

代码语言:javascript
复制
public static string GetNameOf(Func<SprintMetrics, double> valueFunc)
{
    return valueFunc.GetMethodInfo().Name; //Result is : <Excute>b_40....
}

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

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

根据以下拒绝访问的答复,以下两种方法都可以做到:

代码语言:javascript
复制
var p = nameof(SprintMetrics.Productivity); //"Productivity"

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-07 03:50:21

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

代码语言:javascript
复制
var propertyName = nameof(metric.Productivity)

要获得更多信息,请查看下面的文章

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

代码语言:javascript
复制
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)

票数 1
EN

Stack Overflow用户

发布于 2018-09-07 04:04:54

我走着扔"valueFunc",到处都没有“生产力”。

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

如果要检查委托,则使用Expression

代码语言:javascript
复制
public static string GetNameOf<T>(Expression<Func<SprintMetrics, T>> valueFunc)
{
    var expression = (MemberExpression)valueFunc.Body;
    return expression.Member.Name;
}

当然,您需要添加错误处理(如果action.Body不是MemberExpression怎么办?如果它指的是字段而不是属性呢?)。您可以在这个答案中看到一个更完整的示例

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52214937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档