我所有的对象都是由一个名为 GameObject
的抽象基类组成的.所有这些对象都继承自一个或多个接口(interface),例如 IRenderable
, IAnimatable
, IMovable
等
我还有一个存储为 List<GameObject>
的这些对象的列表.我正在尝试编写一个动态方法,它将向我返回从特定接口(interface)继承的所有对象,如下所示:
List<IRenderable> renderableObjects = ObjectManager.GetAll<IRenderable>();
起初,我尝试只返回一个新的游戏对象列表,其中每个对象的类型都与动态类型匹配,然后转换 List<GameObject>
至 List<T>
.我收到的编译器错误表明我无法转换这些类型。
所以我的第二次尝试涉及单独类型转换每个对象,如下所示。
public List<T> GetAll<T>() {
List<T> list = new List<T>();
foreach( GameObject obj in this.gameObjects )
if( obj is T )
list.Add( (T)obj );
return list;
}
但是,这会引发相同类型的错误;无法将类型 GameObject 转换为 T。我是否遗漏了什么?还有其他方法可以实现我想要的吗?
最佳答案
LINQ 已经为您提供了一个非常方便的方法,OfType()
.
List<GameObject> list = ...;
var movableObjects = list.OfType<IMovable>();
OfType
将返回一个序列,其中包含输入序列中可以转换为您指定类型的所有项目。此外还有 Cast<T>()
运算符,它只是尝试转换所有内容,如果无法转换某项,则会抛出异常(这似乎不是您想要的)。
关于c# - 如何将对象转换为动态类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13297855/