2011-12-22 2 views
5

私はCodeContractsから、次の提案を実装したいと思います:それは私がこれを実現するために、ターゲット属性でSupressMessageを使用することができるはずのように感じているフレームワークメソッドでSuppressMessageを使用できますか?

CodeContracts: MyModule: Method MyModule.MyClass.MyMethod: 
To mask *all* warnings issued like the precondition add the attribute: 

[SuppressMessage("Microsoft.Contracts", "RequiresAtCall-propertyAccessor != null")] 

to the method 

System.Linq.Expressions.Expression.Property(System.Linq.Expressions.Expression,System.Reflection.MethodInfo) 

。ただし、これはフレームワークメソッドなので、わかりません。

//doesn't work 
[module: SuppressMessage("Microsoft.Contracts", "RequiresAtCall-propertyAccessor != null", Scope = "Member", Target = "System.Linq.Expressions.Expression.Property(System.Linq.Expressions.Expression,System.Reflection.MethodInfo)", Justification = "This isn't covered by Linq Contracts yet.")] 

どのように私は世界的にこの警告を抑制することができるので、私は、呼び出し場所の警告のすべてをベースラインまたは抑制するために持っていないのですか?

EDIT: The specific usage that requires this measure is: 

void mymethod() 
{ 
    var myObserver = new PropertyObserver<MyViewModel>(); 
    //this line throws the error, within the n => n.Value expression 
    myObserver.RegisterHandler(n => n.Value, OnValueChanged); 
} 

public class PropertyObserver<TPropertySource> where TPropertySource : INotifyPropertyChanged 
{ 
    public PropertyObserver<TPropertySource> RegisterHandler(
     Expression<Func<TPropertySource, object>> expression, 
     Action<TPropertySource> handler) 
    { 
     //what this does is irrelevant; the violation occurs in the method call 
    } 
} 

//n => n.Value decompiles to the following 
public static MemberExpression Property (Expression expression, MethodInfo propertyAccessor) 
{ 
    //and this line is the message I want to suppress, but it's in the .NET framework. 
    ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); 
    ValidateMethodInfo(propertyAccessor); 
    return Property (expression, GetProperty(propertyAccessor)); 
} 
+0

あなたは 'Contract.Assume'を使用していない理由がある石膏にこれらの...とあなたのコードを持っているということですか?ちょうどあまりにも多くの出現? – porges

+0

私たちはContract.Assumeから一般的に離れようとしましたが、はい、かなりの数があります。 –

+0

私は、この問題は、式/ MethodInfosを取得するさまざまな方法が結果が非nullであることを「保証」していないことを推測しています。 http://social.msdn.microsoft.com/Forums/en-NZ/codecontracts/thread/d8e2c2ad-de37-42ef-a854-02052d821975のようないくつかのラッパーメソッドの使用を検討しましたか?そうすれば、あなたは 'Assume'を1つの場所で行うだけでよいので、' Assume'の使用は最小限に抑えられます。 – porges

答えて

3

ラノモアでさらに調査した後、コード契約にバグがあるようです。

n => n.Valueでアクセスされるクラスには、汎用のT Valueプロパティがあります。クラスが非汎用クラス(object Value)に変更された場合、警告は消えます。 (object Valueの一般的なクラスも警告を出します)。

もちろん、これは元の質問には答えませんが、私はそうすることはできないと思います。

+0

それはそうであってはいけません。そうでなければ誰かがすでにそれに答えていたはずです。 ;) –

-1

プロジェクトプロパティの[ビルド]タブを確認してください。 「警告を表示しない」フィールドがあります。

/nowarn (C# Compiler Options)

+1

これらは_compiler_警告ではなく、_code_contact_警告です。私が言うことができる限り、彼らは番号を持っていません - 私は/ nowarnを呼び出すことはできません:5275 –

+0

ああ、私は十分に注意を払っていない!これはあなたが眠らないために支払う価格です。 – Amy

+0

特定のバージョンのドキュメントを指す場合を除き、MSDNリンクにはバージョン番号を記載しないでください。問題は、人々がそれらのページからのリンクをクリックし始め、たとえば.NET 2.0で捕捉されてしまうことです。 –

0
  1. は、プロジェクトのルートにGlobalSuppressions.csを追加します。

  2. があなたの[モジュールを追加...

  3. は、アセンブリと単語モジュールを交換してください。

これは機能しますか?

+0

私は高い期待を持っていましたが、悲しいかな、それはうまくいきません。私はScope = "Member"も削除しました。 –

0

実際に動作します。式を含むメソッドにSupressMessageAttributeを追加できます。 RequiresAtCallを使用しないでください。代わりに、Requiresを使用します。

[SuppressMessage("Microsoft.Contracts", "Requires", 
       Justification = "Bug in static checker")] 
public void Override(AutoMapping<Bookings> mapping) 
{ 
    Contract.Assume(mapping != null); 

    mapping.Id(x => x.Id); 
} 

明白な欠点は、あなたが

+0

それはかなり危険ですか?それはあなたがそこにいるのを抑制している必要があります。私はただ一つのメッセージを抑制することを望んでいた。 –

+0

@ranomore:はい、この1つのメッセージだけを抑制することもできます。 'Requires'の代わりに、' Requires-11-10'を使用しなければなりません。数字は警告の正確な場所を指定します。コードコントラクトのプロジェクトプロパティページで、静的チェッカーの追加コマンドに次のものを追加すると、コード契約からその番号を取得します: '-outputwarnmask'。すべての警告について、その特定の警告を抑制するために使用できる完全なSupressMessage属性を示すメッセージが出力されます(エラーウィンドウではなく出力ウィンドウに出力されます)。 –

+0

私はNHibernateマッピングクラスにこれを使用しませんでした。なぜなら私はあまりにも怠け者でしたからです:) –

関連する問題