.net框架中表达式的名称

本文关键字:表达式 框架 net | 更新日期: 2023-09-27 18:01:30

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

nameof (c# and Visual Basic Reference)

.net框架中表达式的名称

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

如果您谈论的是c# 6之前的等效代码,那么这将以一种hack的方式完成属性的工作。它可以扩展为包括字段、方法等。

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);
}

据我所知,有三个选项不必使用魔法字符串

  1. 的名称,需要Visual Studio 2015(但可以编译到其他版本的。net框架)

    nameof(this.Property)
    
  2. 使用一个方法,该方法接受一个表达式并返回属性名称,如在这篇文章"使用反射获取属性的字符串名称"

    var propertyName = GetPropertyName(  
        () => myObject.AProperty); // returns "AProperty"
    
  3. CallerMemberNameAttribute -(仅在。net框架4.5中可用,包括,因为原始帖子说旧版本,如。net框架4.0,我猜包括4.5)这个方法的缺点是它只在你需要字符串表示当前方法时有用。

    public string IsChecked  {
       set{
           Console.WriteLine(GetCurrentMemberName()); // prints "IsChecked"
       }
    }
    string GetCurrentMemberName([CallerMemberName] string memberName = "")
    {
         return memberName;
    }
    

nameOf -在Compiletime得到解析-如果您反编译,您将看到编译器只是将类名(没有命名空间(!))转换为常量字符串。所以要小心!

如果您想获得一个类的名称,使用typeof()GetType()Runtime获得特定的(可能派生的)类型,并读取
的值.net中的.Name -属性c# 6 .

在MSDN阅读更多

nameof操作符返回传递给它的变量的字符串表示形式,因此nameof(var1)将返回"var1",这有助于避免我们必须将变量名指定为字符串的代码,如在参数异常中。

在以前的版本中,您可以使用反射或表达式树来实现类似的效果。

@Rob,非常感谢,但是静态成员访问也可以用于非静态类成员。

public static class TestExtension {
    public static String nameof<T>(this Expression<Func<T, object>> accessor)
    {
        return nameof(accessor.Body);
    }
}
class MyClass {
    public Guid MyOtherField;
}
TestExtension.nameof<MyClass>(o=>o.MyOtherField);

,好消息是类不会被实例化。访问域层dto是很有用的