CallerMemberName in .NET 4.0 not working
Asked Answered
M

3

24

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;
    }
}
Mefford answered 17/9, 2013 at 3:37 Comment(5)
Which version of the compiler are you using? This feature is implemented by the compiler not the runtime.Rebate
If this helps :C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>csc /? Microsoft (R) Visual C# Compiler version 4.0.30319.17929Mefford
If the compiler does not support it it would cause a compiler error not an empty messageCarrnan
Anyway [CallerMemberName] was introduced in 4.5 so you won't be able to use it in 4.0. Tested with VS2012 targeting 4.0 with C# 5.0Carrnan
Samuel - That is the exact purpose of Microsoft BCL Portability. To be able to use selected 4.5 features in 4.0. nuget.org/packages/Microsoft.BclMefford
M
16

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.

Mefford answered 9/10, 2013 at 22:53 Comment(2)
It seems you can fake it in your own source tree instead of requiring each each developer to install that (although there might issues to address if some had installed it). Please see this and thisGrit
there is easier way. check anser from user373274 ... or this thomaslevesque.com/2012/06/13/…Sadism
G
34

Targeting 4.0 works just fine if you add:

namespace System.Runtime.CompilerServices {
    sealed class CallerMemberNameAttribute : Attribute { }
}
Groundhog answered 11/8, 2016 at 12:22 Comment(1)
thomaslevesque.com/2012/06/13/…Sadism
M
16

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.

Mefford answered 9/10, 2013 at 22:53 Comment(2)
It seems you can fake it in your own source tree instead of requiring each each developer to install that (although there might issues to address if some had installed it). Please see this and thisGrit
there is easier way. check anser from user373274 ... or this thomaslevesque.com/2012/06/13/…Sadism
F
7

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.

Firman answered 18/1, 2014 at 2:9 Comment(1)
thomaslevesque.com/2012/06/13/…Sadism

© 2022 - 2024 — McMap. All rights reserved.