gpt4 book ai didi

c# - 通用类型上的 IsAssignableFrom

转载 作者:行者123 更新时间:2023-11-30 13:15:23 27 4
gpt4 key购买 nike

不确定我是否可以这样做,但我正在尝试查看一个类型是否继承自具有泛型约束的另一个类型。

这是我要查找的类:

public class WorkoutCommentStreamMap : ClassMapping<WorkoutCommentStream>...

这是测试

var inheritableType = typeof(NHibernate.Mapping.ByCode.Conformist.ClassMapping<>);
var isMappedObject = inheritableType.IsAssignableFrom(typeof(WorkoutCommentStreamMap));

如果我将第一行更改为下面,它就可以工作。但这违背了我举例的目的。我的备用解决方法是在我想要查找的所有对象上放置一个自定义的非通用接口(interface),并使用相同的调用。

var inheritableType = typeof(NHibernate.Mapping.ByCode.Conformist.ClassMapping<WorkoutCommentStream>);

最佳答案

泛型定义和封闭泛型之间没有继承关系。因此,IsAssignableFrom 将不起作用。

但是,我使用这个小扩展方法来实现您的目标:

public static bool IsGenericTypeOf(this Type t, Type genericDefinition)
{
Type[] parameters = null;
return IsGenericTypeOf(t, genericDefinition, out parameters);
}

public static bool IsGenericTypeOf(this Type t, Type genericDefinition, out Type[] genericParameters)
{
genericParameters = new Type[] { };
if (!genericDefinition.IsGenericType)
{
return false;
}

var isMatch = t.IsGenericType && t.GetGenericTypeDefinition() == genericDefinition.GetGenericTypeDefinition();
if (!isMatch && t.BaseType != null)
{
isMatch = IsGenericTypeOf(t.BaseType, genericDefinition, out genericParameters);
}
if (!isMatch && genericDefinition.IsInterface && t.GetInterfaces().Any())
{
foreach (var i in t.GetInterfaces())
{
if (i.IsGenericTypeOf(genericDefinition, out genericParameters))
{
isMatch = true;
break;
}
}
}

if (isMatch && !genericParameters.Any())
{
genericParameters = t.GetGenericArguments();
}
return isMatch;
}

使用示例:

Nullable<int> value = 9;
Assert.IsTrue(value.GetType().IsGenericTypeOf(typeof(Nullable<>)));

关于c# - 通用类型上的 IsAssignableFrom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9539601/

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