C# 从现有对象创建对象';s型?
因此,我有一个对象列表,我想循环遍历它们,并根据给定给该方法的参数创建其类型的新对象。有没有办法根据另一个对象的类型创建新对象 背景如下:C# 从现有对象创建对象';s型?,c#,activator,C#,Activator,因此,我有一个对象列表,我想循环遍历它们,并根据给定给该方法的参数创建其类型的新对象。有没有办法根据另一个对象的类型创建新对象 背景如下: private Tile fetchTileByColor(Color c) // color to tile repository fetching { Tile t; for(int x = 0; x < tileRepo.Count; x++) {
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;
}
private Tile fetchTileByColor(颜色c)//颜色到Tile存储库获取
{
瓷砖t;
对于(int x=0;x t=(typeof(tileRepo[x])Activator.CreateInstance(tileRepo[x].GetType());//您对Activator.CreateInstance
的调用很好。但是,您无法将结果强制转换为typeof
的结果-它将不会编译。好消息是,您不需要此强制转换:t
静态键入为Tile
,因此强制转换为Tile
就足够了:
t = (Tile)Activator.CreateInstance(tileRepo[x].GetType());
如果方法的返回类型为Tile
(如代码示例所示),则必须能够将创建的对象强制转换为Tile
类型才能成功。因此,只需更改强制转换,使语句如下所示:
t = (Tile)Activator.CreateInstance(tileRepo[x].GetType());
注意,这假设tileRepo
中的对象实际上都是Tile
的实例或Tile
的子类
也就是说,反射通常是处理问题的错误方法,这里似乎就是这种情况。从您的问题中不清楚为什么不简单地返回找到的对象,也不清楚为什么您似乎不关心返回的对象是如何初始化的(如果您是按颜色获取的,您是否至少希望返回的对象与您找到的对象具有相同的颜色?)
如果出于某种原因返回找到的对象没有意义,那么您可能应该在Tile
类中声明抽象的“cloning”方法并调用它。每个子类都知道如何实际克隆对象,将适当的属性从原始对象复制到新返回的对象
您当然不需要Activator来完成本质上相当于newfloortile()
(如代码示例的最后一条语句所示)