0

C#ジェネリックで問題が発生しています:

MappingAdapter は、FullMappingAdapter と LiteMappingAdapter が継承/実装する共通の抽象基本クラスです。

ジェネリック クラス セッションのインスタンスを作成する:

session = new Session<FullMappingAdapter>(
// ...
)

セッションでは、セッションの種類を決定します。

// class declaration:
public class Session<T> :  ISession
                           where T : MappingAdapter {
    // ...
    // method body:
    T t = null;
    if (t is FullMappingAdapter) {
        // need parameter, cannot use where T : new() above
        t = new FullMappingAdapter(someData) as T;
    } else if (t is LiteMappingAdapter) {
        t = new LiteMappingAdapter(someData) as T;
    } else {
        throw new NotSupportedException("Unknown Adapter specified, please fix.");
    }

    // ... more methods here ...        

}

私は常に NotSupportedException をスローします。また、デバッガーでスタックを見ると、t の「タイプ」列に「FullMappingAdapter」と表示されていますが、これは正しく、期待どおりです。しかし、なぜ「is」キーワードもタイプを認識しないのでしょうか?

私は何を間違っていますか?

4

3 に答える 3

10

null決して何もありません。

typeof(T)代わりに、正確な型 (またはおそらくIsAssignableFrom ) であることを確認します。

is FullMappingAdapter完全一致 (派生型が含まれないため、 と同じではありません)

if(typeof(T) == typeof(FullMappingAdapter))

割り当て可能 - と同じis FullMappingAdapter:

if (typeof(FullMappingAdapter).IsAssignableFrom(typeof(T))
于 2013-10-26T20:26:19.160 に答える
3

を使用するようにチェックを変更する必要がありますtypeof

if (typeof(T) == typeof(FullMappingAdapter))

等々

于 2013-10-26T20:25:37.407 に答える
1

このように確認する必要があります

if (typeof(T) == typeof(FullMappingAdapter))
于 2013-10-26T20:28:35.713 に答える