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;xt=(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()
(如代码示例的最后一条语句所示)