所以我有一个对象列表,我想循环遍历它们并根据给予该方法的参数创建一个新类型的对象。有没有办法根据另一个对象的类型创建一个新对象?
下面的语境:
private Tile fetchTileByColor(Color c) // color to tile repository fetching
{
Tile t;
for(int x = 0; x < tileRepo.Count; x++)
{
if(Art.compareColor(tileRepo[x].id, c))
{
t = (typeof(tileRepo[x]))Activator.CreateInstance(tileRepo[x].GetType()); // <--- Line in question!
return t;
}
}
t = (FloorTile)Activator.CreateInstance(typeof(FloorTile)); // just fetch a floor tile if we couldn't find anything
return t;
}
我有一系列类型
答案 0 :(得分:1)
您对Activator.CreateInstance
的电话很好。但是,您无法将结果强制转换为typeof
的结果 - 它不会编译。好消息是你不需要这个演员:t
被静态输入Tile
,所以转换为Tile
就足够了:
t = (Tile)Activator.CreateInstance(tileRepo[x].GetType());
答案 1 :(得分:1)
如果您的方法的返回类型是Tile
(如您的代码示例所示),那么您必须能够将创建的对象强制转换为Tile
类型才能成功。所以只需更改演员表,使语句如下所示:
t = (Tile)Activator.CreateInstance(tileRepo[x].GetType());
请注意,这假设tileRepo
中的对象实际上每个都是Tile
的实例或Tile
的子类。
也就是说,反思通常是解决问题的错误方法,而这似乎就是这种情况。从你的问题中不清楚你为什么不简单地返回你找到的对象,也不清楚为什么你似乎并不关心如何对象返回的初始化(如果你是按颜色取出,那么&n #39; 至少希望返回的对象颜色与您找到的颜色相同?)。
如果出于某种原因返回您找到的对象没有意义,那么您可能应该只声明抽象&#34;克隆&#34; Tile
类中的方法并调用它。每个子类都知道如何实际克隆对象,将相应的属性从原始属性复制到新返回的属性。
你当然不需要Activator来做基本上等于new FloorTile()
的事情(如你的代码示例的最后一个陈述所示)。