获取扩展方法中第一个参数的名称?

时间:2011-12-08 02:37:27

标签: c# .net reflection extension-methods stackframe

string thing = "etc";
thing = thing.GetName();
//now thing == "thing"

这甚至可能吗?

public static string GetName(this object obj)
{
    return ... POOF! //should == "thing"
}

4 个答案:

答案 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:它们是相同的)。