我正在扫描特定名称空间中实现接口的类型,并尝试将其作为该接口而不是仅返回Type,但是我遇到了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>();
}


更新以回应里德的回答:

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查询返回实现接口的类型(IEnumerable<System.Type>)的集合,而不是该类型的对象的集合。

但是,您尝试返回一个IEnumerable<IGameScript>,它将是实现该接口的对象的实例列表。您需要构造实例以投射到接口本身。

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

10-12 06:09