1

ここで述べたタイプ セーフなメソッドと同様に、ViewModelBaseClass にカスタム Get/SetValue(with INotifyPropertyChanged) ヘルパー関数を追加することにしました。しかし、私はオプションのイニシャライザを Get ヘルパー関数に追加したいと考えています。残念ながら、default キーワードは、参照型を null に、null 許容値型を null に、値型を既定値に初期化します。

型の既定値、Nullable の BaseType の既定値 (可能な場合)、および既定のコンストラクターを持つ参照型の既定のコンストラクターを返す Get ヘルパーによって呼び出される汎用関数を作成したいと考えています。コンストラクターを実装しない参照型の場合、null を返す可能性があると思います。しかし、 if else で new T() と default(T) を呼び出す方法を理解するのは難しいため、コンパイラは適切な制約がないと言います (もちろん制約は実行時にチェックされるため)。

別の方法として、Jon Skeet のhttp://msmvps.com/blogs/jon_skeet/archive/2010/11/02/evil-code-overload-resolution-workaround.aspxを Get ヘルパー メソッドで使用できると思います。言った:

これは、おそらく私が今までに書いた中で最も恐ろしいコードです。

実生活では使用しないでください。別のメソッド名などを使用してください。それでも、それは楽しい小さなパズルですね。

)利点として、デフォルトのコンストラクターなしで参照型を強制して、オプションではないinit Funcを指定できるようになる可能性があります。

4

1 に答える 1

1

この方法を試すことができます。null 許容型の基になる型の既定値を返すより良い方法を見つけられなかったようです。探し続けて、何か見つけたら記事を更新します。ただし、パラメーターなしのコンストラクターなしで参照型を渡すことはできません。

static T GetDefault<T>() where T : new()
{
    var type = typeof (T);
    var underlying = Nullable.GetUnderlyingType(type);
    if (underlying != null)
        return (T) Activator.CreateInstance(underlying);
    return new T();
}

new()または、すべての場合にリフレクションを使用する制約なしでこのバージョンを使用することもできます。そのため、速度が遅くなります。

static T GetDefault<T>()
{
    var type = typeof (T);
    var underlying = Nullable.GetUnderlyingType(type);
    if (underlying != null)
        return (T) Activator.CreateInstance(underlying);
    var constructor = type.GetConstructor(Type.EmptyTypes);
    return (T) (constructor == null ? default(T) : Activator.CreateInstance(type));
}
于 2013-01-02T13:14:15.243 に答える