web-dev-qa-db-fra.com

CallerMemberName dans .NET 4.0 ne fonctionne pas

J'essaie d'utiliser l'attribut CallerMemberName dans .NET 4.0 via le pack de portabilité BCL. Il renvoie toujours une chaîne vide au lieu du nom du membre. Qu'est-ce que je fais mal?

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

J'ai trouvé la solution, bien qu'elle ne me soit pas utile. Vous devez installer KB2468871 au-dessus de .NET Framework 4 pour pouvoir utiliser les attributs d'informations sur l'appelant. Malheureusement, je ne peux pas demander à chaque développeur de se souvenir de l'installer lors de la configuration de l'environnement de développement.

16
Pradeep

Le ciblage 4.0 fonctionne très bien si vous ajoutez:

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

Comme je le sais, CallerMemberName est pris en charge à partir de .Net 4.5 Vous ne devez pas l'utiliser dans .Net 4.0

Quelqu'un a implémenté cela dans .Net 4.0 à l'aide de StackTrace. par exemple: http://www.journeyintocode.com/2013/04/callermembername-net-40.html

MAIS, je ne vous recommande PAS d'utiliser le StackTrace car il pourrait y avoir un impact sur les performances. L'utilisation de StackTrace pour obtenir le nom de l'appelant est très très lente. Et cela fonctionne dans Debug, dans la version, vous ne pouvez pas être sûr que StackTrace est "correct" ou non.

Donc, ma suggestion est la suivante: utilisez simplement CallerMemberName dans .Net 4.5 ou une version ultérieure. Dans la première version de .Net, il n'y a aucun moyen infaillible ou rapide de le faire.

8
Yaping Xin