16

C#でジェネリックnullオブジェクトパターンを実装する方法があるかどうか疑問に思っています。ジェネリックnullオブジェクトは、NothingScalaと同様に、すべての参照型のサブクラスです。のようです

public class Nothing<T> : T where T : class

しかし、コンパイルできず、デフォルトの動作を提供したり、例外をスローしたりするためのメソッドを実装する方法がわかりTません。ここにいくつかの考えがあります:

  1. リフレクションを使用しますか?
  2. 作成時に式ツリーを使用しNothing<T>ますか?たぶんMoqのように見えます。そして別の質問が来ます:製品コードでモックフレームワーク/ライブラリを使用しても大丈夫ですか?
  3. 動的タイプを使用しますか?

私は多分私が特定のタイプのために特定のnullオブジェクトを実装する必要があることを知っています。解決策があるかどうか知りたいだけです。

なにか提案を?ありがとう。

4

5 に答える 5

11

ジェネリックでは、からの継承を定義できませんT。あなたの意図が を使用することである場合if(x is Nothing<Foo>)、それは機能しません。特に、抽象型、シール型、およびデフォルト以外のコンストラクターについて考える必要があります。ただし、次のようなことができます。

public class Nothing<T> where T : class, new()
{
    public static readonly T Instance = new T();
}

ただし、ヌルオブジェクトの主要な機能のほとんどに失敗する IMO。特に、誰かが次のことを行うのは簡単です。

Nothing<Foo>.Instance.SomeProp = "abc";

(おそらく偶然、オブジェクトを 3 レベル下に渡した後)

率直に言って、 を確認するだけでよいと思いますnull

于 2012-07-05T07:40:39.477 に答える
8

これはどう?

public class Nothing<T> where T : class
{
     public static implicit operator T(Nothing<T> nothing)
     {
          // your logic here
     }
}
于 2012-07-05T07:39:42.880 に答える
1

封印されたクラスがあるため、一般的なケースではそのような継承を行うことはできません。多くのクラスは派生することが期待されていないため、機能するかどうかはお勧めできません。

@abatishchev によって提案された暗黙の演算子を使用することは、可能なアプローチのように聞こえます。

于 2012-07-05T07:41:02.463 に答える
0

.NET FrameworkでのNullableの既存の実装はどうですか? http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

于 2012-07-05T07:39:45.780 に答える