.NET Framework Class Library
CallerMemberNameAttribute Class

Allows you to obtain the method or property name of the caller to the method.

Inheritance Hierarchy
SystemObject
   SystemAttribute
    System.Runtime.CompilerServicesCallerMemberNameAttribute

Namespace:   System.Runtime.CompilerServices
Assembly:  mscorlib (in mscorlib.dll)
Syntax
<[%$TOPIC/hh551816_en-us_VS_110_2_0_0_0_0%]([%$TOPIC/hh551816_en-us_VS_110_2_0_0_0_1%].Parameter, Inherited := False)> _
Public NotInheritable Class CallerMemberNameAttribute _
	Inherits [%$TOPIC/hh551816_en-us_VS_110_2_0_0_0_2%]
[[%$TOPIC/hh551816_en-us_VS_110_2_0_1_0_0%]([%$TOPIC/hh551816_en-us_VS_110_2_0_1_0_1%].Parameter, Inherited = false)]
public sealed class CallerMemberNameAttribute : [%$TOPIC/hh551816_en-us_VS_110_2_0_1_0_2%]
[[%$TOPIC/hh551816_en-us_VS_110_2_0_2_0_0%]([%$TOPIC/hh551816_en-us_VS_110_2_0_2_0_1%]::Parameter, Inherited = false)]
public ref class CallerMemberNameAttribute sealed : public [%$TOPIC/hh551816_en-us_VS_110_2_0_2_0_2%]
[<[%$TOPIC/hh551816_en-us_VS_110_2_0_3_0_0%]>]
[<[%$TOPIC/hh551816_en-us_VS_110_2_0_3_0_1%]([%$TOPIC/hh551816_en-us_VS_110_2_0_3_0_2%].Parameter, Inherited = false)>]
type CallerMemberNameAttribute =  
    class 
        inherit [%$TOPIC/hh551816_en-us_VS_110_2_0_3_0_3%] 
    end
public final class CallerMemberNameAttribute extends [%$TOPIC/hh551816_en-us_VS_110_2_0_4_0_0%]

The CallerMemberNameAttribute type exposes the following members.

Constructors
  NameDescription
Public method CallerMemberNameAttributeInitializes a new instance of the CallerMemberNameAttribute class.
Top
Properties
  NameDescription
Public property TypeIdWhen implemented in a derived class, gets a unique identifier for this Attribute. (Inherited from Attribute.)
Top
Methods
  NameDescription
Public method EqualsInfrastructure. Returns a value that indicates whether this instance is equal to a specified object. (Inherited from Attribute.)
Public method GetHashCodeReturns the hash code for this instance. (Inherited from Attribute.)
Public method GetTypeGets the Type of the current instance. (Inherited from Object.)
Public method IsDefaultAttributeWhen overridden in a derived class, indicates whether the value of this instance is the default value for the derived class. (Inherited from Attribute.)
Public method MatchWhen overridden in a derived class, returns a value that indicates whether this instance equals a specified object. (Inherited from Attribute.)
Public method ToStringReturns a string that represents the current object. (Inherited from Object.)
Top
Explicit Interface Implementations
  NameDescription
Explicit interface implemetation Private method _AttributeGetIDsOfNamesMaps a set of names to a corresponding set of dispatch identifiers. (Inherited from Attribute.)
Explicit interface implemetation Private method _AttributeGetTypeInfoRetrieves the type information for an object, which can be used to get the type information for an interface. (Inherited from Attribute.)
Explicit interface implemetation Private method _AttributeGetTypeInfoCountRetrieves the number of type information interfaces that an object provides (either 0 or 1). (Inherited from Attribute.)
Explicit interface implemetation Private method _AttributeInvokeProvides access to properties and methods exposed by an object. (Inherited from Attribute.)
Top
Remarks

You apply the CallerMemberName attribute to an optional parameter that has a default value. You must specify an explicit default value for the optional parameter. You can't apply this attribute to parameters that aren't specified as optional.

For more information, see Caller Information (C# and Visual Basic).

You can use the CallerMemberName attribute to avoid specifying the member name as a String argument to the called method. By using this technique, you avoid the problem that Rename Refactoring doesn't change the String values. This is especially useful for the following tasks:

  • Using tracing and diagnostic routines.

  • Implementing the INotifyPropertyChanged interface when binding data. This interface allows the property of an object to notify a bound control that the property has changed, so that the control can display the updated information. Without the CallerMemberName attribute, you must specify the property name as a literal.

The following chart shows the member names that are returned when you use the CallerMemberName attribute.

Call occurs within

Member name result

Method, property, or event

The name of the method, property, or event from which the call originated.

Constructor

The string ".ctor"

Static constructor

The string ".cctor"

Destructor

The string "Finalize"

User-defined operators or conversions

The generated name for the member, for example, "op_Addition".

Attribute constructor

The name of the member to which the attribute is applied. If the attribute is any element within a member (such as a parameter, a return value, or a generic type parameter), this result is the name of the member that's associated with that element.

No containing member (for example, assembly-level or attributes applied to types)

The default value of the optional parameter.

Examples

The following example shows how to use the CallerMemberName attribute. On each call to the TraceMessage method, the caller information is substituted as an argument to the optional parameter.

Private Sub DoProcessing()
    TraceMessage("Something happened.")
End Sub 

Public Sub TraceMessage(message As String,
        <System.Runtime.CompilerServices.CallerMemberName> Optional memberName As String = Nothing,
        <System.Runtime.CompilerServices.CallerFilePath> Optional sourcefilePath As String = Nothing,
        <System.Runtime.CompilerServices.CallerLineNumber()> Optional sourceLineNumber As Integer = 0)

    System.Diagnostics.Trace.WriteLine("message: " & message)
    System.Diagnostics.Trace.WriteLine("member name: " & memberName)
    System.Diagnostics.Trace.WriteLine("source file path: " & sourcefilePath)
    System.Diagnostics.Trace.WriteLine("source line number: " & sourceLineNumber)
End Sub 

' Sample output: 
'   message: Something happened. 
'   member name: DoProcessing 
'   source file path: C:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoVB\CallerInfoVB\Form1.vb 
'   source line number: 15
public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
    System.Diagnostics.Trace.WriteLine("message: " + message);
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output: 
//  message: Something happened. 
//  member name: DoProcessing 
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs 
//  source line number: 31
Version Information

.NET Framework

Supported in: 4.6, 4.5

Supported in: Windows Phone 8.1

Supported in: Windows Phone Silverlight 8.1

Supported in: Windows Phone Silverlight 8
Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.