23

CallerMemberNameBCL ポータビリティ パックを介して .NET 4.0 で属性を使用しようとしています。メンバー名ではなく、常に空の文字列を返します。私は何を間違っていますか?

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

3 に答える 3

16

私には役に立ちませんが、解決策を見つけました。呼び出し元情報属性を使用できるようにするには、.NET Framework 4 の上にKB2468871をインストールする必要があります。残念ながら、開発環境をセットアップするときに、各開発者に忘れずにインストールするように求めることはできません。

于 2013-10-09T22:53:45.893 に答える
8

私が知っているように、CallerMemberName.Net 4.5 からサポートされています。.Net 4.0 では使用しないでください。

誰かが StackTrace を使用して .Net 4.0 でこれを実装しました。例: http://www.journeyintocode.com/2013/04/callermembername-net-40.html

ただし、パフォーマンスが低下する可能性があるため、StackTrace の使用はお勧めしません。StackTrace を使用して呼び出し元の名前を取得すると、非常に時間がかかります。そして、これはデバッグで機能します。リリースでは、StackTrace が「正しい」かどうかはわかりません。

したがって、私の提案は次のとおりですCallerMemberName。.Net 4.5以降のバージョンで使用してください。.Net の初期のバージョンでは、これを行う簡単な方法や迅速な方法はありません。

于 2014-01-18T02:09:27.320 に答える