我一直在构建一个游戏模板,作为测试我在c#中新学到的能力的一种手段,我一直在研究一种从另一个对象列表返回对象列表的方法。但是我只想要一个特定对象的列表(类型作为参数输入)
newObjectList = area.getSpecificObjects(Tile)
我研究过函数
public List<Object> getSpecificObjects(System.Type type)
{
List<Object> searchObjects = objects.Objects; //Returns a List of Objects from the class ObjectList
System.Type searchType = type;
return (searchObjects.FindAll(
delegate(Object obj)
{
return obj is searchType;
})
);
}
然而,我尝试生产一种方法失败了。委托部分中的"searchtype"变量一直返回错误"无法找到类型或名称空间名称'type/namespace'(您是否缺少using指令或程序集引用?)"
谁能推荐一种正确的方法来写这样一个函数或告诉我为什么我的尝试失败了?理想情况下是后者,因为这样我可以学到更多。我已经在StackOverflow上搜索了,目前找不到我的答案,为什么我的函数失败了。
is
是一个"编译时"操作符,这意味着你不能对Type
类型的对象使用它。
下面是实现方法的正确方法:
public class Finder
{
public static List<T> GetSpecificObjects<T>(List<Object> source)
{
return (List<T>) source.Where(item => item.GetType() == typeof (T));
}
}
Ofc,如果你不知道编译时的类型,你可以使用Type
public static List<Object> GetSpecificObjects(Type t, List<Object> source)
{
return source.Where(item => item.GetType() == t).ToList();
}
如果你还不想使用LINQ或泛型,这里是你的代码的工作版本:
newObjectList = area.getSpecificObjects(typeof(Tile));
public List<Object> getSpecificObjects(System.Type searchType)
{
List<Object> searchObjects = objects.Objects; //Returns a List of Objects from the class ObjectList
return (searchObjects.FindAll(
delegate(Object obj)
{
return obj.GetType() == searchType;
})
);
}
PS:您已经使用LINQ与.FindAll
;)
谢谢大家的帮助。这就是你帮我做的。
public List<Object> getSpecificObjects(System.Type type)
{
List<Object> searchObjects = objects.Objects; //Returns a List of Objects from the class ObjectList
System.Type searchType = type;
return (searchObjects.FindAll(x => x.GetType() == searchType));
}