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

person Pradeep    schedule 17.09.2013    source источник
comment
Какую версию компилятора вы используете? Эта функция реализована компилятором, а не средой выполнения.   -  person Mike Zboray    schedule 17.09.2013
comment
Если это поможет :C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC›csc /? Компилятор Microsoft (R) Visual C# версии 4.0.30319.17929   -  person Pradeep    schedule 17.09.2013
comment
Если компилятор не поддерживает это, это вызовет ошибку компилятора, а не пустое сообщение.   -  person Samuel    schedule 17.09.2013
comment
В любом случае [CallerMemberName] появился в версии 4.5, поэтому вы не сможете использовать его в версии 4.0. Протестировано с VS2012 для версии 4.0 с C# 5.0.   -  person Samuel    schedule 17.09.2013
comment
Сэмюэл. Именно в этом и заключается цель переносимости Microsoft BCL. Чтобы иметь возможность использовать выбранные функции 4.5 в версии 4.0. nuget.org/packages/Microsoft.Bcl   -  person Pradeep    schedule 10.10.2013


Ответы (3)


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

namespace System.Runtime.CompilerServices {
    sealed class CallerMemberNameAttribute : Attribute { }
}
person user3734274    schedule 11.08.2016
comment
thomaslevesque.com/2012/06/13/ - person A Khudairy; 24.07.2017

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

person Pradeep    schedule 09.10.2013
comment
Кажется, вы можете подделать его в своем собственном дереве исходных текстов, вместо того, чтобы требовать, чтобы каждый разработчик установил его (хотя могут возникнуть проблемы, которые необходимо решить, если некоторые его установили). См. это и это - person Giles; 30.01.2014
comment
есть способ проще. проверьте ответ от user373274 ... или это thomaslevesque.com/2012/06/13/ - person A Khudairy; 24.07.2017

Насколько я знаю, 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 не было надежного или быстрого способа сделать это.

person Yaping Xin    schedule 18.01.2014
comment
thomaslevesque.com/2012/06/13/ - person A Khudairy; 24.07.2017