string thing = "etc";
thing = thing.GetName();
//now thing == "thing"
这甚至可能吗?
public static string GetName(this object obj)
{
return ... POOF! //should == "thing"
}
答案 0 :(得分:4)
没有。在您使用它的时候,“名称”将是“obj” - 可以通过MethodBase.GetCurrentMethod()检索(使用调试符号)。GetParameters() [0] .Name。
但是,您无法从调用方法中检索变量名称。
答案 1 :(得分:4)
我同意@Reed的回答。但是,如果你真的想要实现这个功能,你可以做到这一点:
string thing = "etc";
thing = new{thing}.GetName();
GetName
扩展方法只使用反射来从匿名对象中获取第一个属性的名称。
唯一的另一种方法是使用Lambda Expression,但代码肯定会复杂得多。
答案 2 :(得分:0)
如果您需要扩展方法中的原始变量名称,我认为最好这样做:
thing.DoSomething(nameof(thing));
public static string DoSomething(this object obj, string name) {
// name == "thing"
}
答案 3 :(得分:-2)
C#6中的新内容是nameof()
,它将完全取代扩展方法。
if (x == null) throw new ArgumentNullException(nameof(x)); WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode”
有些相关的是CallerMemberAttribute
,它将获取调用该函数的方法的名称。一个useful comparison of the two methods,其中包含与PropertyChanged
事件相关的示例,还讨论了生成的IL代码(TL; DR:它们是相同的)。