无法将 GetTypes() 转换为接口

发布于 2024-10-22 20:22:54 字数 980 浏览 0 评论 0原文

我正在扫描特定命名空间以查找实现接口的类型,并尝试将它们作为该接口而不只是类型返回,但我收到了 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;
}

I'm scanning a particular namespace for types that implement an interface, and trying to return them as that interface rather than just Type, but i'm getting an 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>();
}

Update in response to Reed's answer:

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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

衣神在巴黎 2024-10-29 20:22:54

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

但是,您尝试返回一个 IEnumerable,它是实现该接口的对象的实例列表。您需要构造实例才能转换为接口本身。

Your LINQ query returns a collection of Types (IEnumerable<System.Type>) which implement the interface, not a collection of objects of that type.

However, you're trying to return an IEnumerable<IGameScript>, which would be a list of instances of objects that implement that interface. You'll need to construct instances in order to cast to the interface itself.

憧憬巴黎街头的黎明 2024-10-29 20:22:54

假设您有默认构造函数,您可以简单地将 Select LINQ 调用改造成类似这样的内容,并实际获取该类型的实例:

.Select(x => Activator.CreateInstance(x))

Assuming you have default constructors, you can simple reform your Select LINQ call to something like this and actually get the instances of that type:

.Select(x => Activator.CreateInstance(x))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文