我正在扫描特定命名空间以查找实现接口(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/