c# - 如何将对象转换为动态类型?

标签 c# .net .net-4.0

我所有的对象都是由一个名为 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/

相关文章:

c# - IReliable ReadWrite DocumentClient 在 Documentdb 中缺少分区解析器

.net - 404 - 在 Controller Y 上找不到公共(public)操作方法 X(ActionInvoker.InvokeAction 返回 false)

c# - 如何将一个 for 循环分成多个循环并使用线程运行它们以缩短运行时间?

c# - 使用 IXmlSerializable 对象序列化对象时出现 InvalidOperationException

c# - 分开一个长字符串

c# - 使用面板 RenderControl 方法时无法找到具有 id 的控件

c# - 将 XML 反序列化为 XSD 生成的类时出现问题

.net - Visual Studio 2015 RC中没有框架

c# - 每个继承类类型的继承静态成员都不同?

winforms - 将工作委派给多个线程的模式