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 回答