无法将GetTypes()强制转换为接口

时间:2011-03-19 01:42:28

标签: c# reflection

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

假设你有默认的构造函数,你可以简单地将Select LINQ调用改为类似的东西,并实际得到该类型的实例:

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