Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多个类类型的列表中调用特定的类函数_C#_List_Class_Inheritance_Crash - Fatal编程技术网

C# 在多个类类型的列表中调用特定的类函数

C# 在多个类类型的列表中调用特定的类函数,c#,list,class,inheritance,crash,C#,List,Class,Inheritance,Crash,我正在尝试使用C#(使用与问题无关的XNA)制作一个2D游戏。我已经创建了一个基本的tile类,游戏中的所有tile都将从中继承基本功能,比如如何在屏幕上绘制自己等等 我所拥有的是一个基本瓦片类的列表,其中包含从该基类继承的所有其他类,例如:门、墙、地砖等 List<TileBase> tileList = new List<TileBase>(); ... tileList.Add(new Door(arguments)); tile

我正在尝试使用C#(使用与问题无关的XNA)制作一个2D游戏。我已经创建了一个基本的tile类,游戏中的所有tile都将从中继承基本功能,比如如何在屏幕上绘制自己等等

我所拥有的是一个基本瓦片类的列表,其中包含从该基类继承的所有其他类,例如:门、墙、地砖等

    List<TileBase> tileList = new List<TileBase>();

    ...

    tileList.Add(new Door(arguments));
    tileList.Add(new Wall(arguments));
我得到一个错误:

    "Unable to cast object of type '...Tiles.Wall' to type '...Tiles.Door'."

所以基本上,我有一个充满不同类的列表。如何在循环中访问类中的特定函数,而不使程序在另一种类型的类上尝试时崩溃,而该类没有上述函数。

您可以研究OfType方法,它根据类型进行过滤:

using System.Linq;

foreach(tileList.OfType()中的变量门)
{
门。开关();
}

您可以研究OfType方法,它根据类型进行过滤:

using System.Linq;

foreach(tileList.OfType()中的变量门)
{
门。开关();
}

您可以使用基类进行迭代,然后检查spesific对象是否是
类的实例。如果是,则强制转换到
对象

foreach(TileBase td in tileList)
{
       if(td is Door)
       {
             ((Door) td).Toggle();
       }
}

您可以使用基类进行迭代,然后检查spesific对象是否是
Door
类的实例。如果是,则强制转换到
对象

foreach(TileBase td in tileList)
{
       if(td is Door)
       {
             ((Door) td).Toggle();
       }
}

这可能(稍微)比OfType效率低,因为它将迭代未使用的对象。我想@Khan会对性能感兴趣,因为它是一款游戏。我之前也尝试过类似的东西,但当时对我来说没有效果。似乎我需要你在td和(门)周围加上括号。所以现在我有两个可能的解决方案,如果我将来需要类似的东西!谢谢这可能(稍微)比OfType效率低,因为它将迭代未使用的对象。我想@Khan会对性能感兴趣,因为它是一款游戏。我之前也尝试过类似的东西,但当时对我来说没有效果。似乎我需要你在td和(门)周围加上括号。所以现在我有两个可能的解决方案,如果我将来需要类似的东西!谢谢@user2499152使用System.Linq放入
位于文件顶部,这样类型的
将在范围内。太棒了!似乎正在工作,感谢您的快速响应!这肯定会派上用场的。我很高兴这个解决方案很简单,因为我很难找到类似的问题。谢谢!:)@user2499152使用System.Linq放入
位于文件顶部,这样类型的
将在范围内。太棒了!似乎正在工作,感谢您的快速响应!这肯定会派上用场的。我很高兴这个解决方案很简单,因为我很难找到类似的问题。谢谢!:)
foreach(Door door in tileList.where(a=>a is Door))
{
    door.Toggle();
}