c# - 无法将 GetTypes() 转换为接口(interface)

标签 c# reflection

我正在扫描特定命名空间以查找实现接口(interface)的类型,并尝试将它们作为该接口(interface)返回,而不仅仅是类型,但我收到了 InvalidCastException

IEnumerable<IGameScript> GetDemos()
{
    var results = Assembly.GetExecutingAssembly().GetTypes()
        .Where(
        x => x.IsClass 
        && x.Namespace == "MMOClass.CodeBase.Demos" 
        && x.Name.Contains("Demo") 
        && x.GetInterfaces().Contains(typeof(IGameScript))
        ).Select(x => x);

    return results.Cast<IGameScript>();
}

更新以响应 Reed 的回答:

IEnumerable<IGameScript> GetDemos()
{
    var results = Assembly.GetExecutingAssembly().GetTypes()
        .Where(
        x => x.IsClass 
        && x.Namespace == "MMOClass.CodeBase.Demos" 
        && x.Name.Contains("Demo") 
        && x.GetInterfaces().Contains(typeof(IGameScript))
        ).Select(x => Activator.CreateInstance(x) as IGameScript);

    return results;
}

最佳答案

您的 LINQ 查询返回实现接口(interface)的类型 ( IEnumerable<System.Type> ) 的集合,而不是该类型对象的集合。

但是,您试图返回 IEnumerable<IGameScript> ,这将是实现该接口(interface)的对象的实例列表。您需要构建实例才能转换为接口(interface)本身。

关于c# - 无法将 GetTypes() 转换为接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359445/

相关文章:

c# - Entity Framework 代码优先 Fluent API

java - 通过反射在类中设置值,将类、字段和值作为方法中的参数

c# - 如何使用反射转换为通用接口(interface)?

c# - 使用数据表创建 ExpandoObject

c# - C# 和通信端口

c# - 如何在 C# 中有效地从另一个列表中减去一个巨大的列表

c# - 在匿名类型中包含基于条件的属性

c# - 使用 TextBox 或 RichTextBox 显示图像文件中的原始数据?

java - 反射 - 使用未知数量的构造函数参数获取未知类的新实例

c# - 使用反射从属性名称中获取 lambda 表达式