gpt4 book ai didi

c# - 如何测试类的实例是否为特定泛型类型?

转载 作者:行者123 更新时间:2023-11-30 17:20:31 25 4
gpt4 key购买 nike

假设我有一个简单的泛型类如下

public class MyGenericClass<t>
{
public T {get;set;}
}

我如何测试一个类的实例是否是 MyGenericClass ?例如我想做这样的事情:

MyGenericClass x = new MyGenericClass<string>();
bool a = x is MyGenericClass;
bool b = x.GetType() == typeof(MyGenericClass);

但我不能只引用 MyGenericClass . Visual Studio 总是要我写 MyGenericClass<something> .

最佳答案

测试您的实例是否属于 MyGenericClass<T> 类型,你可以这样写。

MyGenericClass<string> myClass = new MyGenericClass<string>();
bool b = myClass.GetType().GetGenericTypeDefinition() == typeof(MyGenericClass<>);

如果您希望能够将您的对象声明为 MyGenericClass而不是 MyGenericClass<string> , 它需要一个 MyGenericClass 的非泛型基础成为继承树的一部分。但到那时,您将只能引用基础上的属性/方法,除非您稍后转换为派生的泛型类型。直接声明泛型实例时不能省略类型参数。*

*当然,您可以选择使用类型推断并编写

var myClass = new MyGenericClass<string>();

编辑 Adam Robinson 在评论中提出了一个很好的观点,假设您有 class Foo : MyGenericClass<string> .上面的测试代码不会将 Foo 的实例识别为 MyGenericClass<>。 , 但您仍然可以编写代码来测试它。

Func<object, bool> isMyGenericClassInstance = obj =>
{
if (obj == null)
return false; // otherwise will get NullReferenceException

Type t = obj.GetType().BaseType;
if (t != null)
{
if (t.IsGenericType)
return t.GetGenericTypeDefinition() == typeof(MyGenericClass<>);
}

return false;
};

bool willBeTrue = isMyGenericClassInstance(new Foo());
bool willBeFalse = isMyGenericClassInstance("foo");

关于c# - 如何测试类的实例是否为特定泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4103522/

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