C# 中带有“as”和“is”的泛型有问题,“is”检查失败

本文关键字:is 泛型 失败 有问题 检查 as | 更新日期: 2023-09-27 18:37:07

我在使用 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"关键字不能识别类型呢?

我做错了什么?

C# 中带有“as”和“is”的泛型有问题,“is”检查失败

null从来都不是任何东西。

您希望检查typeof(T)是否为确切类型(或者可能是 IsAssignableFrom)。

完全匹配(与is FullMappingAdapter不同,因为它不包括派生类型)

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

可分配 - 与is FullMappingAdapter相同:

if (typeof(FullMappingAdapter).IsAssignableFrom(typeof(T))

您应该修改支票以使用 typeof

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

等等

你必须像这样检查

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