具有nameof运算符的方法链

时间:2015-10-27 15:37:32

标签: c# c#-6.0

如果我nameof(instance.SomeProperty),则评估为"SomeProperty"

有什么方法可以获得整个方法链"instance.SomeProperty"

我知道我可以做nameof(instance) + "." + nameof(instance.SomeProperty),但是有更好的方法可以维护吗?

3 个答案:

答案 0 :(得分:5)

  

我有什么方法可以获得整个方法链" instance.SomeProperty"?

不。但是,您可以执行与其他解决方案类似的操作:

$"{nameof(instance)}.{nameof(instance.SomeProperty)}"

您可以尝试here

答案 1 :(得分:1)

不,没有。 nameof运算符只是在表达式的末尾产生属性(或类,字段等),因此nameof(Program.Main)将产生Mainnameof(ConsoleAppliation1.Program.Main)也是如此。< / p>

nameof运营商并不打算做你要求的事。它只是为了阻止依赖于属性/类名的唯一名称的事件处理程序,依赖项属性等传递名称。你想要做的所有其他花哨的东西都是你自己的。

M.kazem Akhgary评论一样,您可以自己构建表达式来自行完成:

$"{nameof(instance)}.{nameof(instance.SomeProperty)}"

答案 2 :(得分:0)

我的5美分:

using System;
using System.Linq.Expressions;

public static class Program {
    public static void Main() {
        Console.WriteLine(Name.Of<A>(x => x.B.Hehe)); // outputs "B.Hehe"

        var a = new A();
        Console.WriteLine(Name.Of(() => a.B.Hehe));   // outputs "B.Hehe"
    }

    public class A {
        public B B { get; } // property
    } 

    public class B {
        public int Hehe; // or field, does not matter
    } 
}

public static class Name 
{
    public static string Of(this Expression<Func<object>> expression) => Of(expression.Body);

    public static string Of<T>(this Expression<Func<T, object>> expression) => Of(expression.Body);

    public static string Of(this Expression expression)
    {
        switch (expression)
        {
            case MemberExpression m:                
                var prefix = Of(m.Expression);
                return (prefix == "" ? "" : prefix + ".") + m.Member.Name;
            case UnaryExpression u when u.Operand is MemberExpression m:
                return Of(m);
            default:
                return "";
        }
    }
}