在早期版本的 C# 中通过 C#6 的 nameof 功能的代码部分实现?

Partial implemention through code of C#6's nameof functionality in earlier versions of C#?

"nameof" 是一个了不起的想法,即使部分复制也可以很好地复制到以前的版本中。

我对 public 属性 这样的名字特别感兴趣:

public class MyClass
{
    public SomeType Myproperty {get;set;}
}


static Main()
{
    MyClass myClass = new MyClass();

    Console.WriteLine(Utilities.NameOf(myClass.MyProperty)); //Writes "MyProperty".
    Console.ReadKey();
}

有没有办法做到这一点(也许通过反射等)?如果我们能做到这一点,它还可以为我们将来升级到 C#6 时准备代码,只需将 Utilities.NameOf 替换为 nameof.

感谢Alexei Levenkov指点正确的方向,

Schotime's for his answer in this question

agent-j's for his answer in this question

有一个简单而优雅的解决方案,有两个版本:

public static class Util
{
    public static string NameOf<TProperty>(Expression<Func<TProperty>> e)
    {
        return (e.Body as MemberExpression).Member.Name;
    }

    public static string NameOf<TClass, TProperty>(Expression<Func<TClass, TProperty>> e)
    {
        return (e.Body as MemberExpression).Member.Name;
    }
}

并且可以这样使用:

public class MyClass
{
    public SomeProperty MyProperty { get; set; }
}


static void Main(string[] args)
{
    MyClass myClass = new MyClass();


    string case1 = Util.NameOf(() => myClass.MyProperty);       //Case1 when an instance is available 250x
    string case2 = Util.NameOf(() => (null as MyClass).MyProperty); //Case2 when no instance is available 175x
    string case3 = Util.NameOf((MyClass c) => c.MyProperty);        //Case3 when no instance is available 330x

    string caseTest = "MyProperty";     //Test case 1x

}

在每个案例结束时,数字显示每次调用相对于文字字符串赋值的速度。

这是通过将每次调用的 return 值分配给字符串数组并将其与相同值 "MyProperty" 的文字字符串分配进行比较来完成的。

Case2 似乎是赢家。