c# - 查找给定泛型基类型和实现类型的类型

标签 c# .net reflection

<分区>

这是我的。

BaseClass<T>
{
}

MyClass
{
}

NewClass : BaseClass<MyClass>
{
}

我需要查看是否有一个类使用 MyClass 的特定泛型实现来实现 BaseClass,并获取该类的类型。在这种情况下,它将是 NewClass

编辑

AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).Where(
typeof(BaseClass<>).MakeGenericType(typeof(MyClass)).IsAssignableFrom);

这将返回实现 BaseClass< MyClass > 的所有类型的列表。

谢谢

最佳答案

如果您有要测试的类型列表(称为 types),您可以使用 IsAssignableFrom 方法获取从指定基类继承的所有类型:

var baseType = typeof(BaseClass<MyClass>);
var info = types.Where(t => baseType.IsAssignableFrom(t)).FirstOrDefault();
if (info != null) 
  // We have some type 'info' which matches your requirements

如果您只有关于 MyClass 类型的运行时信息,那么您可以像这样获取 baseType:

Type myClassInfo = // get runtime info about MyClass
var baseTypeGeneric = typeof(BaseClass<>);
var baseType = baseTypeGeneric.MakeGenericType(myClassInfo);

您写道您需要以某种方式找到类,所以最后一个问题是如何获取列表 types。为此,您需要搜索一些程序集 - 您可以从当前正在执行的程序集(如果该类型在您的应用程序中)或一些由名称标识的知名程序集开始。

// Get all types from the currently running assembly
var types = Assembly.GetExecutingAssembly().GetTypes();

不幸的是,没有办法“神奇地”找到这样的类型——您需要搜索所有可用的类型,这可能是一项非常昂贵的操作。但是,如果您只需要执行一次(例如,在应用程序启动时),您应该没问题。

关于c# - 查找给定泛型基类型和实现类型的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2951417/

相关文章:

c# - 如何隐藏文本框、标签和按钮 C# WPF

c# - 在 .NET 中播放 .WAV 文件

java - 如何在不使用instanceOf或getClass()的情况下知道类类型?

java - 如何从 JMX 服务器获取 Mbean

c# - 编码 mp3 或其他音乐文件

c# - 如何从 FromSql 获取计数?

c# - Dapper SetTypeMap 破坏了 DapperExtension 的 ClassMapper

java - 从运行时加载的 java 9 模块加载类时出现 ClassNotFoundException

c# - 使用 LINQ 使搜索方法通用

c# - 您如何使用技术(已描述)处理 .Net 中的 C 结构和指针?