2014-11-02 4 views
0

Итак, у меня есть список объектов, и я хочу пропустить их и создать новый объект своего типа на основе аргументов, заданных методу. Есть ли способ создать новый объект, основанный на типе другого объекта?Создать объект из существующего объекта?

Контекст ниже:

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

У меня есть массив типов

ответ

1

Если ваш метод в возвращаемый тип Tile (как показано в вашем примере кода), то вы должны уметь создать созданный объект для типа Tile для успеха. Так просто изменить оттенок, так что заявление выглядит следующим образом:

t = (Tile)Activator.CreateInstance(tileRepo[x].GetType()); 

Обратите внимание, что это предполагает, что объекты в tileRepo фактически каждый экземпляр Tile или подкласс Tile.

Это говорит о том, что отражение, как правило, является неправильным способом решения проблем, и это, по-видимому, имеет место здесь. Из вашего вопроса неясно, почему вы просто не возвращаете объект, который вы находите, и почему вам не кажется, что он не заботится о том, как возвращенный объект инициализируется (если вы выбираете цвет, не могли бы вы не менее хотите возвращенный объект имеет тот же цвет, что и тот, который вы нашли?).

Если по какой-либо причине нет смысла возвращать найденный объект, то вы, вероятно, должны просто объявить абстрактный метод клонирования в классе Tile и назвать это. Каждый подкласс будет знать, как на самом деле клонировать объект, копируя соответствующие свойства из оригинала в вновь возвращенный.

И вам, разумеется, не нужен активатор, чтобы сделать то, что по существу составляет new FloorTile() (как в последнем примере вашего примера кода).

1

Ваш вызов Activator.CreateInstance хорошо. Однако вы не можете передать результат в результат typeof - он не собирается компилироваться. Хорошая новость заключается в том, что вам не нужен этот бросок: t статически типизированных к Tile, поэтому приведение к Tile будет достаточно:

t = (Tile)Activator.CreateInstance(tileRepo[x].GetType()); 
Смежные вопросы