1

私は、NUnit のAssert. 理想的には、式を渡し、それが true かどうかを確認し、そうでない場合は、パラメーターまたはエラー メッセージと共に特定の例外をスローします。理想的な世界では、私は次のようなことをしています:

// ideal
Assert.True<ArgumentNullException>(user != null, "User", "User cannot be null");

// not so ideal
Assert.True(user != null, new ArgumentNullException("User", "User cannot be null");

さて、私の問題は、目的のタイプの新しい例外を作成するために、の制約が にAssert.True<T>なることです。Exception, new()私が直面している重要な問題は、まずジェネリック コンストラクターがパラメーターを許可しないことと、Exceptionコンストラクターのほとんどのプロパティが GET のみであることです。

どんな助けでも大歓迎です、ありがとう。

4

3 に答える 3

2

Microsoft のコード コントラクトのサポートについては既にご存じだと思いますが、そうでない場合 (したがって、無意識のうちに車輪の再発明を行っている場合) は、ここでそれらについて確認できます。

http://research.microsoft.com/en-us/projects/contracts/

于 2012-04-03T10:56:24.423 に答える
1

このようなものはどうですか:

Assert.True(user != null, () => new ArgumentNullException("User", "User cannot be null");

例外のインスタンス化を匿名メソッドに委譲することにより、必要な場合にのみ例外を構築します。Assertこれにより、クラスで例外をインスタンス化する際の問題も回避できます。

Assert.True次に、次のようになります。

public static True(bool condition, Action<Exception> exception)
{
    if(!condition) throw exception();
}
于 2012-04-03T10:53:03.123 に答える
0

ご回答ありがとうございます。の形でわずかな回避策を見つけましたSystem.Activator.CreateInstance。これは、非常によく似た投稿で説明されています: C# での例外のキャスト:

throw (T) System.Activator.CreateInstance(typeof(T), message, innerException);
于 2012-04-03T13:13:12.450 に答える