Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CallerMemberName in .NET 4.0 not working

I am trying to use CallerMemberName attribute in .NET 4.0 via BCL portability pack. It is always returning an empty string instead of the member name. What am I doing wrong?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        MessageBox.Show(new class2().CallMe);
    }
}

public class class2
{
    public string CallMe 
    {
        get
        {
            return HelpMe();
        }
    }

    private string HelpMe([CallerMemberName] string param = "")
    {
        return param;
    }
}
like image 459
Pradeep Avatar asked Sep 17 '13 03:09

Pradeep


3 Answers

Targeting 4.0 works just fine if you add:

namespace System.Runtime.CompilerServices {
    sealed class CallerMemberNameAttribute : Attribute { }
}
like image 72
user3734274 Avatar answered Nov 17 '22 18:11

user3734274


I found the solution, though it's not useful to me. You need to install KB2468871 on top of .NET Framework 4 to be able to use caller info attributes. Unfortunately, I can't ask each developer to remember to install it when they setup development environment.

like image 16
Pradeep Avatar answered Nov 17 '22 18:11

Pradeep


As I know, CallerMemberName is supported from .Net 4.5 You should not use it in .Net 4.0

Someone implemented this in .Net 4.0 using StackTrace. for example: http://www.journeyintocode.com/2013/04/callermembername-net-40.html

BUT, I do NOT recommend you to use the StackTrace since there could be a performance hit. Using StackTrace to get the caller name is very very slow. And this works in Debug, in release you cannot be sure whether StackTrace is "correct" or not.

So, my suggestion is: Just use CallerMemberName in .Net 4.5 or later version. In the early version of .Net, there isn't any foolproof or fast way of doing this.

like image 8
Yaping Xin Avatar answered Nov 17 '22 19:11

Yaping Xin