.net框架中的表达名称4

MSL*_*MSL 22 c# c#-6.0 nameof

"nameof"表达式在Visual Studio 2015和c#6中引入

nameof(C#和Visual Basic参考)

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

Rob*_*Rob 27

如果您在C#6之前谈论C#的等价物,那么这将完成属性的工作(以一种黑客的方式).它可以扩展到包括字段,方法等.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

刚刚快速推出,所以还有很多需要改进的地方,但你这样使用它:

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

var a = new myClass();
var result = a.nameof(b => b.myProp);
Run Code Online (Sandbox Code Playgroud)

结果包含'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;
    }
}
Run Code Online (Sandbox Code Playgroud)

访问静态属性/字段:

TestExtension.nameof(() => myClass.MyOtherField)
Run Code Online (Sandbox Code Playgroud)

访问函数内的参数:

void func (int a) {
    TestExtension.nameof(() => a);
}
Run Code Online (Sandbox Code Playgroud)