我有以下实用程序例程,用于确定类型是否来自特定类型:
private static bool DerivesFrom(Type rType, Type rDerivedType)
{
while ((rType != null) && ((rType != rDerivedType)))
rType = rType.BaseType;
return (rType == rDerivedType);
}
(实际上我不知道是否有更方便的方法来测试推导......)
问题是我想确定一个类型派生自泛型类型,但是没有指定泛型参数。
例如我可以写:
DerivesFrom(typeof(ClassA), typeof(MyGenericClass<ClassB>))
但我需要的是以下
DerivesFrom(typeof(ClassA), typeof(MyGenericClass))
我怎样才能实现它?
基于 Darin Miritrov 的示例,这是一个示例应用程序:
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace ConsoleApplication1
{
public class MyGenericClass<T> { }
public class ClassB {}
public class ClassA : MyGenericClass<ClassB> { }
class Program
{
static void Main()
{
bool result = DerivesFrom(typeof(ClassA), typeof(MyGenericClass<>));
Console.WriteLine(result); // prints **false**
}
private static bool DerivesFrom(Type rType, Type rDerivedType)
{
return rType.IsSubclassOf(rDerivedType);
}
}
}
答案 0 :(得分:5)
您可以将通用参数保持打开状态:
DerivesFrom(typeof(ClassA), typeof(MyGenericClass<>));
应该有效。例如:
public class ClassA { }
public class MyGenericClass<T>: ClassA { }
class Program
{
static void Main()
{
var result = DerivesFrom(typeof(MyGenericClass<>), typeof(ClassA));
Console.WriteLine(result); // prints True
}
private static bool DerivesFrom(Type rType, Type rDerivedType)
{
return rType.IsSubclassOf(rDerivedType);
}
}
另请注意IsSubClassOf方法的用法,该方法应简化您的DerivesFrom
方法并使其失败。您还可以查看IsAssignableFrom方法。