c# - .net framework 4 中的 nameof 表达式

标签 c# c#-6.0 nameof

在 Visual Studio 2015 和 c# 6 中引入了“nameof”表达式

nameof (C# and Visual Basic Reference)

如何在 .net Framework 4 等旧版本中使用它或编写类似的方法。

最佳答案

如果您谈论的是 C#6 之前的 C# 的等效项,这将完成属性的工作(以一种 hacky 的方式)。它可能会扩展到包括字段、方法等。

public static class TestExtension
{
    public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor)
    {
        if (propertyAccessor.Body.NodeType == ExpressionType.MemberAccess)
        {
            var memberExpression = propertyAccessor.Body as MemberExpression;
            if (memberExpression == null)
                return null;
            return memberExpression.Member.Name;
        }
        return null;
    }
}

只是快速完成了这个,所以还有很多需要改进的地方,但是你可以这样使用它:

public class myClass
{
    public string myProp { get; set; }
}

var a = new myClass();
var result = a.nameof(b => b.myProp);

结果包含'myProp'

更新:

更全面(虽然还是不够漂亮)

public static class TestExtension
{
    public static String nameof<T, TT>(this Expression<Func<T, TT>> accessor)
    {
        return nameof(accessor.Body);
    }

    public static String nameof<T>(this Expression<Func<T>> accessor)
    {
        return nameof(accessor.Body);
    }

    public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor)
    {
        return nameof(propertyAccessor.Body);
    }

    private static String nameof(Expression expression)
    {
        if (expression.NodeType == ExpressionType.MemberAccess)
        {
            var memberExpression = expression as MemberExpression;
            if (memberExpression == null)
                return null;
            return memberExpression.Member.Name;
        }
        return null;
    }
}

访问静态属性/字段:

TestExtension.nameof(() => myClass.MyOtherField)

在函数中访问参数:

void func (int a) {
    TestExtension.nameof(() => a);
}

关于c# - .net framework 4 中的 nameof 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31261955/

相关文章:

c# - 我们如何在 C# 中为 WebForm 中的按钮单击事件显示进度条?

c# - 如何将(和 Marshall)CityHash std::pair<uint64,uint64> 从 C# 转换为 C++,反之亦然

c# - 用表达式定义的属性与传统方式有什么实际区别?

c# - "nameof "运算符 ,"expression cannot be used in an argument to nameof"

c# - Object.GetType() 也返回项目名称

c# - 设置 textBox.Text 不会更新绑定(bind)的双向属性?

c# - 如何使取消按钮像 "X"按钮一样工作?

c# - Visual Studio 2015/C# 6/Roslyn 无法编译 PCL 项目中的 XML 注释

c# - 使用 nameof 运算符而不是 CallerMemberNameAttribute 来通知 .NET 4.5.3 中的属性更改有什么好处吗?

c# - 使用 nameof 获取当前方法的名称