如果我nameof(instance.SomeProperty)
,则评估为"SomeProperty"
。
有什么方法可以获得整个方法链"instance.SomeProperty"
?
我知道我可以做nameof(instance) + "." + nameof(instance.SomeProperty)
,但是有更好的方法可以维护吗?
答案 0 :(得分:5)
我有什么方法可以获得整个方法链" instance.SomeProperty"?
不。但是,您可以执行与其他解决方案类似的操作:
$"{nameof(instance)}.{nameof(instance.SomeProperty)}"
您可以尝试here。
答案 1 :(得分:1)
不,没有。 nameof
运算符只是在表达式的末尾产生属性(或类,字段等),因此nameof(Program.Main)
将产生Main
,nameof(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 "";
}
}
}