我正在扫描特定的命名空间以查找实现接口的类型,并尝试将它们作为该接口返回而不仅仅是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>();
}
Run Code Online (Sandbox Code Playgroud)
更新以回应里德的回答:
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;
}
Run Code Online (Sandbox Code Playgroud)
您的LINQ查询返回实现接口的Types(IEnumerable<System.Type>)集合,而不是该类型对象的集合.
但是,您正在尝试返回一个实现该接口的对象实例IEnumerable<IGameScript>列表.您需要构造实例才能转换为接口本身.