获取调用扩展方法的引用的名称

时间:2014-02-25 13:47:13

标签: c#

假设我有一个名为MyExtensionMethod的扩展方法。

我想这样用:

var x = new MyClass()
x.MyExtensionMethod()

然后,在扩展方法中,我想获取它被调用的引用的名称:

public static void MyExtensionMethod(this object param)
{
    //get the name "x" somehow
}

这可能吗?

1 个答案:

答案 0 :(得分:4)

在C#中,这是不可能的。确定可用的信息如下:

  1. 调用方法的名称。
  2. 发生呼叫的文件的名称。
  3. 通话的行号。
  4. 来源:Caller Information (C# and Visual Basic)


    如果您只是想简化参数检查,请在以下文件夹中创建一个文件:

    %USERPROFILE%\ Documents \ Visual Studio 2012 \ Code Snippets \ Visual C#\ My Code Snippets

    如果您有多个版本的Visual Studio,或者版本不同于2012,则其他版本将存在适当命名的替代文件夹。

    将文件命名为 ThrowIfArgumentNull.snippet ,其中包含以下内容。要使用它,请在编辑器中键入tan,然后按Tab键两次。您将获得IntelliSense支持以输入参数名称,字符串参数将自动填充。此代码段会创建标准ArgumentNullException,但您可以修改它以使用GuardArgument类,如果这是您的项目所使用的。

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
      <CodeSnippet Format="1.0.0">
        <Header>
          <SnippetTypes>
            <SnippetType>Expansion</SnippetType>
          </SnippetTypes>
          <Title>Throw if argument null</Title>
          <Author>Sam Harwell</Author>
          <Description>Throw an ArgumentNullException if the specified argument is null.</Description>
          <HelpUrl>
          </HelpUrl>
          <Shortcut>tan</Shortcut>
        </Header>
        <Snippet>
          <Declarations>
            <Literal Editable="true">
              <ID>arg</ID>
              <ToolTip>arg</ToolTip>
              <Default>arg</Default>
              <Function>
              </Function>
            </Literal>
            <Literal Editable="false">
              <ID>ArgumentNullException</ID>
              <ToolTip>ArgumentNullException</ToolTip>
              <Default>ArgumentNullException</Default>
              <Function>SimpleTypeName(global::System.ArgumentNullException)</Function>
            </Literal>
          </Declarations>
          <Code Language="csharp"><![CDATA[if ($arg$ == null)
        throw new $ArgumentNullException$("$arg$");$end$]]></Code>
        </Snippet>
      </CodeSnippet>
    </CodeSnippets>