从现有对象的类型创建对象?

时间:2014-11-02 20:30:44

标签: c# activator

所以我有一个对象列表,我想循环遍历它们并根据给予该方法的参数创建一个新类型的对象。有没有办法根据另一个对象的类型创建一个新对象?

下面的语境:

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;
        }

我有一系列类型

2 个答案:

答案 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()的事情(如你的代码示例的最后一个陈述所示)。