在c#中获取字段的名称

鉴于此课程:

public class MyClass { public int MyField {get; set;} } 

我如何能够在代码中提取MyField的名称?

例如,我可以像这样得到类的名称

 typeof(MyClass).Name 

我该如何为该领域做类似的事情?

问题的原因是我希望这个特定的代码能够抵抗名称的重构。

编辑:有耐力我的意思是我希望呼叫站点的代码在字段名的变化面前是健壮的。 我有一些使用字段名称的字符串表示的东西。 对不起的措辞很糟糕。 我没有包含呼叫站点代码以保持问题清洁,而不是徘徊在有关呼叫站点代码性质的其他讨论中。

你这样做,使用编译器生成的表达式树:

 public static string GetMemberName(Expression> memberAccess) { return ((MemberExpression)memberAccess.Body).Member.Name; } 

现在从代码中调用静态方法:

 class MyClass { public int Field; public string Property { get; set; } } var fieldName = GetMemberName((MyClass c) => c.Field); var propertyName = GetMemberName((MyClass c) => c.Property); // fieldName has string value of `Field` // propertyName has string value of `Property` 

您现在还可以使用重构来重命名该字段,而不会破坏此代码

在C#6中,我们可以非常简单地完成它

 nameof(MyField); 

您可以以相同的方式获取方法\ type \ propery \ field \ class \ namespace名称

  nameof(MyClass); nameof(namespacename1) // returns "namespacename1" nameof(TestEnum.FirstValue) // returns enum's first value 

MSDN参考

看看这篇文章

使用C#6.0,您可以使用新的nameof运算符。

 nameof(MyClass.MyField) // returns "MyField" nameof(MyClass) //returns "MyClass" 

有关更多示例,请参阅nameof(C#和Visual Basic参考) 。

您可以使用以下类,其中包含使用表达式树作为参数的方法,以根据lambda表达式确定成员名称:

 public class MemberHelper { public string GetName(Expression> expression) { MemberExpression memberExpression = expression.Body as MemberExpression; if (memberExpression != null) return memberExpression.Member.Name; throw new InvalidOperationException("Member expression expected"); } } 

然后像这样使用它:

 MemberHelper memberHelper = new MemberHelper(); string name = memberHelper.GetName(x => x.MyField); 

使用Reflection您可以找到MyClass所有成员。

  MemberInfo[] members = typeof(MyClass).GetMembers(); 

现在,您可以为每个会员找到您想要的房产。

  foreach ( MemberInfo memberInfo in members) { Console.WriteLine("Name: {0}", memberInfo.Name); // Name: MyField Console.WriteLine("Member Type: {0}", memberInfo.MemberType); // Member Type: Property } 

如果只想查找属性,请使用PropertyInfo而不是MemberInfo 。 或写这个

  foreach ( MemberInfo memberInfo in members.Where(p => p.MemberType == MemberTypes.Property)) { Console.WriteLine("Name: {0}", memberInfo.Name); // Name: MyField Console.WriteLine("Member Type: {0}", memberInfo.MemberType); // Member Type: Property } 

如果您只想获取实例成员的名称,则可以使用更短的代码:

  public static string GetMemberName(Expression> memberAccess) { return ((MemberExpression)memberAccess.Body).Member.Name; } 

并在课堂上使用它如下:

  ReflectionTools.GetMemberName(() => _someInstanceVariableOrProperty)