.net框架中的表达名称4

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

nameof(C#和Visual Basic参考)

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

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

 public static class TestExtension { public static String nameof(this T obj, Expression> 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(this Expression> accessor) { return nameof(accessor.Body); } public static String nameof(this Expression> accessor) { return nameof(accessor.Body); } public static String nameof(this T obj, Expression> 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); } 

nameOf – 在nameOf获取解析 – 如果您反编译,您将看到编译器只是将类名(没有命名空间(!))转换为常量字符串。 所以要注意!

如果你想获得一个classe的名字,可以使用typeof()GetType()来获取Runtime的特定(可能是派生的)类型并读取
.net中的.Name -Property

在MSDN上阅读更多内容

据我所知,有三种选择不必使用魔术字符串

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

     nameof(this.Property) 
  2. 使用一个接受表达式并返回属性名称的方法,如本文“ 使用reflection获取属性的字符串名称 ”中所示

     var propertyName = GetPropertyName( () => myObject.AProperty); // returns "AProperty" 
  3. CallerMemberNameAttribute – (仅在.net framework 4.5中提供,因为原始post说的.net framework 4.0之类的旧版本我认为包括4.5)这个方法的缺点是它只在你需要当前方法的字符串表示时才有用你在经营。

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

nameof运算符返回您传递的变量的字符串表示forms,因此nameof(var1)将返回“var1”,它有助于避免代码,我们必须将变量名称特定为字符串,如在参数exception中。

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