【问题标题】:Partial implemention through code of C#6's nameof functionality in earlier versions of C#?在 C# 的早期版本中通过 C#6 的 nameof 功能的代码部分实现?
【发布时间】:2015-04-10 02:29:00
【问题描述】:

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

我对以下公共财产名称特别感兴趣:

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


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

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

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

【问题讨论】:

  • 如果您可以使用像 Util.Foo(()=> myClass.MyProperty) 这样的额外代码,您可以使用表达式树轻松获得。
  • @AlexeiLevenkov 可能是一个解决方案。额外的代码并不多(只是额外的()=>)。你能告诉我怎么做吗?
  • 我认为stackoverflow.com/questions/671968/… 涵盖了它。如果没有,那么 SO 上应该有类似的样本。
  • @AlexeiLevenkov 我发布了一个解决方案。感谢您的建议。非常欢迎改进和进一步的建议。

标签: c# reflection keyword language-features


【解决方案1】:

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

Schotime 的答案在this question

agent-j 他在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

}

在每个案例的末尾,数字显示每个调用相对于文字字符串分配的速度。

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

案例 2 似乎是赢家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多