CallerMemberName в .NET 4.0 не работает

Я пытаюсь использовать атрибут CallerMemberName в .NET 4.0 через пакет переносимости BCL. Он всегда возвращает пустую строку вместо имени члена. Что я делаю неправильно?

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;
    }
}

Ответы

Ответ 1

Я нашел решение, хотя это мне не полезно. Вам нужно установить KB2468871 поверх .NET Framework 4, чтобы иметь возможность использовать атрибуты информации о вызывающем абоненте. К сожалению, я не могу просить каждого разработчика помнить об установке его при настройке среды разработки.

Ответ 2

Targeting 4.0 работает отлично, если вы добавляете:

namespace System.Runtime.CompilerServices {
    sealed class CallerMemberNameAttribute : Attribute { }
}

Ответ 3

Как я знаю, CallerMemberName поддерживается с .Net 4.5 Вы не должны использовать его в .Net 4.0

Кто-то реализовал это в .Net 4.0, используя StackTrace. например: http://www.journeyintocode.com/2013/04/callermembername-net-40.html

НО, я НЕ рекомендую вам использовать StackTrace, так как может быть удар по производительности. Использование StackTrace для получения имени вызывающего абонента очень медленно. И это работает в Debug, в выпуске вы не можете быть уверены, что StackTrace "правильный" или нет.

Итак, мое предложение: просто используйте CallerMemberName в .Net версии 4.5 или более поздней версии. В ранней версии .Net нет надежного или быстрого способа сделать это.