c# - 检查对象是否为 C# 中的非特定泛型类型

标签 c# .net generics types

假设我有以下类(class):

public class General<T> { }

我想知道一个对象是否属于那种类型。 我知道我可以使用反射来确定对象是否属于 Type.GetGenericTypeDefinition 的泛型类型,但我想避免这种情况。

是否可以做类似 obj is General<T> 的事情? , 或 obj.GetType().IsAssignableFrom(typeof(General<T>))

我很惊讶我找不到类似的问题,尽管我可能在搜索中使用了错误的关键字。

最佳答案

你可以这样做:

var obj = new General<int>();
var type = obj.GetType();
var isGeneral = 
(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(General<>)) ||
type.GetBaseTypes().Any(x => x.IsGenericType && 
                             x.GetGenericTypeDefinition() == typeof(General<>));

其中GetBaseTypes是下面的扩展方法:

public static IEnumerable<Type> GetBaseTypes(this Type type)
{
    if (type.BaseType == null) return type.GetInterfaces();

    return new []{type}.Concat(
           Enumerable.Repeat(type.BaseType, 1)
                     .Concat(type.GetInterfaces())
                     .Concat(type.GetInterfaces().SelectMany<Type, Type>(GetBaseTypes))
                     .Concat(type.BaseType.GetBaseTypes()));
}

归功于 Slacks answer

关于c# - 检查对象是否为 C# 中的非特定泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687264/

相关文章:

java - 如何使用泛型调用最具体的方法?

c++ - 如何在 C++ 中处理泛型对象

c# - 无法将类型 'Microsoft.SolverFoundation.Services.Term' 隐式转换为 'bool'

c# - 如何使用Nest将具有数组值的settings属性添加到ES-index

.net - NLog每日归档大小限制

c# - 并行 For 循环。他们在等待完成吗?

c# - 我应该使用 .NET (System.Net.Mail) 来批量发送我的 Web 应用程序的电子邮件还是 SQL (msdb.sp_send_dbmail)?

c# - FakeItEasy:根据表达式返回不同的对象

c# - 从*新* ComboBox 文本更新,而不是旧文本

c# - 为什么泛型方法不能将具体(派生)类转换为其父类