2017-03-11 19 views
0

nameofの補完候補をメソッドのパラメーターに追加したいと思います。Resharperでパラメーターの補完候補を 'nameof'に追加

方法:

public static class Ensure 
{ 
    /// <summary> 
    /// throws <see cref="ArgumentException"/> exception if string is null or empty. 
    /// </summary> 
    /// <param name="value">string to check its content.</param> 
    /// <param name="name">name of parameter passed.</param> 
    public static void StringNotNullOrEmpty(string value, string name) 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      throw new ArgumentException("Value cannot be null or empty", name); 
     } 
    } 
} 

私は<...>ためnameof(testString)提案を取得したいと思いEnsure.StringNotNullOrEmpty(testString, <...>)を入力します。上記の方法は、nameofを示唆していません(さらに悪いことに、 'n'をタイプした後には、nullnewというような提案しか得られません)。 nameof(...)が必要なので、に正しいParamNameが表示されます。 ReSharperののサイトで

それはArgumentNullExceptionInvokerParameterNameAttribute(ソース:Resharper InvokerParameterNameAttribute)を使用してnameofの提案を使用することを言います。

試み: だから私は私のプロジェクトでnugetパッケージインストール:JetBrains.Annotations 10.4.0をし、以下のようにメソッドを変更:私は「とき

public static class Ensure 
{ 
    /// <summary> 
    /// throws <see cref="ArgumentException"/> exception if string is null or empty. 
    /// </summary> 
    /// <param name="value">string to check its content.</param> 
    /// <param name="name">name of parameter passed.</param> 
    public static void StringNotNullOrEmpty([CanBeNull] string value, 
     [NotNull] [InvokerParameterName] string name) 
    { 
     if (string.IsNullOrEmpty(value)) 
     { 
      throw new ArgumentException("Value cannot be null or empty", name); 
     } 
    } 
} 

は、残念ながら、上記の試みは、まだ私にnameofの提案を与えていませんタイプ:Ensure.StringIsNotNullOrEmpty(testString,

CallerMemberNameAttributeMSDNです。しかし、これは呼び出すメソッドの名前をstringとして与えるだけです。

私はGitHubのいくつかのリポジトリも調べましたが、私の試みと同じ方法でしか解決策を見つけることができませんでした。

私が考えることができる理由の1つは、後者にInvokerParameterNameAttributeが定義されたメソッドに2つのstringパラメータがある場合です。これはResharperにとって混乱を招く可能性があります。

nameofメソッドのパラメータの提案を追加することはできますか?そして、私は上記の方法でこれをどのように達成できますか?

追加情報: 私はVS2015 + Resharper 2016.3.2を持っています。

答えて

1

実際には動作しますが(意図したとおりではありません) ,と入力するとすぐに示唆されません。これは、nameof式を使用する代わりに、文字列の形式で引数の名前を完全に入力すると、nameof式を使用することを推奨します。

static void Caller(string arg) 
{ 
    StringNotNullOrEmpty(arg, "arg"); // only now resharper suggests to use nameof. 
    StringNotNullOrEmpty(arg, "something else"); // now resharper complains about unknown argument name. 
} 

submit feedback resharperでは、実際に必要な動作を実装することができます。

また、""と入力すると、カーソルは二重引用符の中央に移動し、resharperは使用可能なパラメータの名前を示します。

はところで、あなたはいつも私がメソッド呼び出しを書いた後

/// <summary> 
/// throws <see cref="ArgumentException"/> exception if string is null or empty. 
/// </summary> 
/// <param name="value">string to check its content.</param> 
/// <param name="name">name of parameter passed.</param> 
public static void StringNotNullOrEmpty([CanBeNull] string value, 
    [NotNull] [InvokerParameterName] string name) 
{ 
    if (string.IsNullOrEmpty(value)) 
    { 
     throw new ArgumentException("Value cannot be null or empty", name); 
    } 
} 
+0

ReSharperのは確か 'nameof'を示唆しておき、将来の読者のために役立つことができ、あなたのコードをコメントすることができますが、私は見たい' nameof'私はそれを入力している間の提案。 '新しいArgumentNullExceptionをスローするとき(' nameof(value) 'を直接示唆しています)、私のメソッドでも可能ですか?このメソッドのドキュメントに関しては、これを投稿から除外しました。 – Goat

+0

@FirstOrGoat私が知る限り、あなたが望む動作を達成することはできません。この動作に関するフィードバックを提出し、提出したり、解決策を提供したりすることができます –

+0

ありがとう!私はResharperに関するこの提案を行い、フィードバックを受け取ったら投稿してください。 – Goat

関連する問題