gpt4 book ai didi

c# - 判断对象是否是泛型基类的实例,任意泛型类型

转载 作者:太空狗 更新时间:2023-10-29 22:13:32 34 4
gpt4 key购买 nike

我需要在不知道泛型类型参数的情况下测试一个值是否是泛型基类的实例。使用 MSDN example作为示例的基础,这是我想要完成的:

using System;

public class Class1<T> { }
public class DerivedC1 : Class1<int> { }

class IsSubclassTest
{
public static void Main()
{
Console.WriteLine(
"DerivedC1 subclass of Class1: {0}",
typeof(DerivedC1).IsSubclassOf(typeof(Class1<>)) // <- Here.
);
}
}

虽然这在语法上是正确的,但它总是会产生错误。如果我删除通用类型参数,它会按预期工作(返回 true)。

如何在不知道其泛型类型参数的情况下测试类类型是否是泛型基类的子类?

最佳答案

问题是 DrevidedC1 不是 Class1<T> 的子类, 它是 Class1<int> 的子类.确保您了解这种细微差别; Class1<T>是一个开放类型(T 可以是任何东西,它还没有被设置)而DerivedC1扩展封闭类型 Class1<int> (它不再在 T 中打开,T 设置为 int 且仅 int )。因此,当您执行以下操作时:

 typeof(DerivedC1).IsSubclassOf(typeof(Class1<>))

答案显然是false .

您需要做的是检查 DerivedC1通用类型定义的基类型(将其视为 Class1<int> 的相应开放泛型类型)等于 Class1<T>它显然是这样做的。

因此正确的代码是:

typeof(DerivedC1).BaseType.GetGenericTypeDefinition() == typeof(Class1<>));

或者更好,正如 Matías Fidemraizer 在他的 answer 中所说的那样:

typeof(DerivedC1).BaseType.GetGenericTypeDefinition().IsAssignableFrom(typeof(Class1<>)));

关于c# - 判断对象是否是泛型基类的实例,任意泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184154/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com